Skip to content

Commit

Permalink
[Branch-2.0](Serde) Fix content displayed by complex types in MySQL C…
Browse files Browse the repository at this point in the history
…lient (#26880)

backport #25946 and #26301
  • Loading branch information
BePPPower authored Nov 15, 2023
1 parent 9450a59 commit fececab
Show file tree
Hide file tree
Showing 115 changed files with 2,773 additions and 2,706 deletions.
2 changes: 1 addition & 1 deletion be/src/vec/data_types/data_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class IDataType : private boost::noncopyable {
virtual Status from_string(ReadBuffer& rb, IColumn* column) const;

// get specific serializer or deserializer
virtual DataTypeSerDeSPtr get_serde() const = 0;
virtual DataTypeSerDeSPtr get_serde(int nesting_level = 1) const = 0;

protected:
virtual String do_get_name() const;
Expand Down
4 changes: 3 additions & 1 deletion be/src/vec/data_types/data_type_agg_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ class DataTypeAggState : public DataTypeString {
return _agg_function->create_serialize_column();
}

DataTypeSerDeSPtr get_serde() const override { return _agg_serialized_type->get_serde(); };
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return _agg_serialized_type->get_serde(nesting_level);
};

DataTypePtr get_serialized_type() const { return _agg_serialized_type; }

Expand Down
5 changes: 3 additions & 2 deletions be/src/vec/data_types/data_type_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,9 @@ class DataTypeArray final : public IDataType {
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;

DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeArraySerDe>(nested->get_serde());
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeArraySerDe>(nested->get_serde(nesting_level + 1),
nesting_level);
};
};

Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_bitmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ class DataTypeBitMap : public IDataType {

static void deserialize_as_stream(BitmapValue& value, BufferReadable& buf);

DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeBitMapSerDe>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeBitMapSerDe>(nesting_level);
};
};

Expand Down
4 changes: 3 additions & 1 deletion be/src/vec/data_types/data_type_date.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ class DataTypeDate final : public DataTypeNumberBase<Int64> {

MutableColumnPtr create_column() const override;

DataTypeSerDeSPtr get_serde() const override { return std::make_shared<DataTypeDate64SerDe>(); }
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeDate64SerDe>(nesting_level);
}
};

} // namespace doris::vectorized
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_date_time.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ class DataTypeDateTime final : public DataTypeNumberBase<Int64> {

std::string to_string(const IColumn& column, size_t row_num) const override;

DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeDateTimeSerDe>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeDateTimeSerDe>(nesting_level);
}

Field get_field(const TExprNode& node) const override {
Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,8 @@ class DataTypeDecimal final : public IDataType {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeDecimalSerDe<T>>(scale, precision);
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeDecimalSerDe<T>>(scale, precision, nesting_level);
};

/// Decimal specific
Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_fixed_length_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class DataTypeFixedLengthObject final : public IDataType {
bool have_subtypes() const override { return false; }

bool can_be_inside_low_cardinality() const override { return false; }
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeFixedLengthObjectSerDe>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeFixedLengthObjectSerDe>(nesting_level);
};
};

Expand Down
4 changes: 3 additions & 1 deletion be/src/vec/data_types/data_type_hll.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ class DataTypeHLL : public IDataType {

static void deserialize_as_stream(HyperLogLog& value, BufferReadable& buf);

DataTypeSerDeSPtr get_serde() const override { return std::make_shared<DataTypeHLLSerDe>(); };
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeHLLSerDe>(nesting_level);
};
};

} // namespace doris::vectorized
4 changes: 3 additions & 1 deletion be/src/vec/data_types/data_type_jsonb.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ class DataTypeJsonb final : public IDataType {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;
DataTypeSerDeSPtr get_serde() const override { return std::make_shared<DataTypeJsonbSerDe>(); };
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeJsonbSerDe>(nesting_level);
};

private:
DataTypeString data_type_string;
Expand Down
6 changes: 4 additions & 2 deletions be/src/vec/data_types/data_type_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,10 @@ class DataTypeMap final : public IDataType {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeMapSerDe>(key_type->get_serde(), value_type->get_serde());
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeMapSerDe>(key_type->get_serde(nesting_level + 1),
value_type->get_serde(nesting_level + 1),
nesting_level);
};
};

Expand Down
2 changes: 1 addition & 1 deletion be/src/vec/data_types/data_type_nothing.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class DataTypeNothing final : public IDataType {
}

bool have_subtypes() const override { return false; }
DataTypeSerDeSPtr get_serde() const override {
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
LOG(FATAL) << get_name() << " not support serde";
};
};
Expand Down
5 changes: 3 additions & 2 deletions be/src/vec/data_types/data_type_nullable.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,9 @@ class DataTypeNullable final : public IDataType {
const DataTypePtr& get_nested_type() const { return nested_data_type; }
bool is_null_literal() const override { return nested_data_type->is_null_literal(); }

DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeNullableSerDe>(nested_data_type->get_serde());
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeNullableSerDe>(nested_data_type->get_serde(nesting_level),
nesting_level);
}

private:
Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_number_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@ class DataTypeNumberBase : public IDataType {
Status from_string(ReadBuffer& rb, IColumn* column) const override;
bool is_null_literal() const override { return _is_null_literal; }
void set_null_literal(bool flag) { _is_null_literal = flag; }
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeNumberSerDe<T>>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeNumberSerDe<T>>(nesting_level);
};

private:
Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class DataTypeObject : public IDataType {
LOG(FATAL) << "Unimplemented get_field for object";
}

DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeObjectSerDe>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeObjectSerDe>(nesting_level);
};
};
} // namespace doris::vectorized
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_quantilestate.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ class DataTypeQuantileState : public IDataType {
static void serialize_as_stream(const QuantileState<T>& value, BufferWritable& buf);

static void deserialize_as_stream(QuantileState<T>& value, BufferReadable& buf);
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeQuantileStateSerDe<T>>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeQuantileStateSerDe<T>>(nesting_level);
};
};
using DataTypeQuantileStateDouble = DataTypeQuantileState<double>;
Expand Down
4 changes: 2 additions & 2 deletions be/src/vec/data_types/data_type_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ class DataTypeString : public IDataType {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeStringSerDe>();
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeStringSerDe>(nesting_level);
};
};

Expand Down
6 changes: 3 additions & 3 deletions be/src/vec/data_types/data_type_struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,12 @@ class DataTypeStruct final : public IDataType {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
bool get_have_explicit_names() const { return have_explicit_names; }
DataTypeSerDeSPtr get_serde() const override {
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
DataTypeSerDeSPtrs ptrs;
for (auto iter = elems.begin(); iter < elems.end(); ++iter) {
ptrs.push_back((*iter)->get_serde());
ptrs.push_back((*iter)->get_serde(nesting_level + 1));
}
return std::make_shared<DataTypeStructSerDe>(ptrs, names);
return std::make_shared<DataTypeStructSerDe>(ptrs, names, nesting_level);
};
};

Expand Down
8 changes: 5 additions & 3 deletions be/src/vec/data_types/data_type_time.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ class DataTypeTime final : public DataTypeNumberBase<Float64> {
bool can_be_used_in_boolean_context() const override { return true; }
bool can_be_inside_nullable() const override { return true; }

DataTypeSerDeSPtr get_serde() const override { return std::make_shared<DataTypeTimeSerDe>(); };
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeTimeSerDe>(nesting_level);
};
TypeIndex get_type_id() const override { return TypeIndex::Time; }
const char* get_family_name() const override { return "time"; }
};
Expand Down Expand Up @@ -104,8 +106,8 @@ class DataTypeTimeV2 final : public DataTypeNumberBase<Float64> {
bool can_be_inside_nullable() const override { return true; }

void to_pb_column_meta(PColumnMeta* col_meta) const override;
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeTimeV2SerDe>(_scale);
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeTimeV2SerDe>(_scale, nesting_level);
};
TypeIndex get_type_id() const override { return TypeIndex::TimeV2; }
const char* get_family_name() const override { return "timev2"; }
Expand Down
8 changes: 5 additions & 3 deletions be/src/vec/data_types/data_type_time_v2.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ class DataTypeDateV2 final : public DataTypeNumberBase<UInt32> {

bool can_be_inside_nullable() const override { return true; }

DataTypeSerDeSPtr get_serde() const override { return std::make_shared<DataTypeDateV2SerDe>(); }
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeDateV2SerDe>(nesting_level);
}

Field get_field(const TExprNode& node) const override {
DateV2Value<DateV2ValueType> value;
Expand Down Expand Up @@ -127,8 +129,8 @@ class DataTypeDateTimeV2 final : public DataTypeNumberBase<UInt64> {
std::string to_string(const IColumn& column, size_t row_num) const override;
void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override;
Status from_string(ReadBuffer& rb, IColumn* column) const override;
DataTypeSerDeSPtr get_serde() const override {
return std::make_shared<DataTypeDateTimeV2SerDe>(_scale);
DataTypeSerDeSPtr get_serde(int nesting_level = 1) const override {
return std::make_shared<DataTypeDateTimeV2SerDe>(_scale, nesting_level);
};

Field get_field(const TExprNode& node) const override {
Expand Down
43 changes: 21 additions & 22 deletions be/src/vec/data_types/serde/data_type_array_serde.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,13 @@ void DataTypeArraySerDe::serialize_one_cell_to_json(const IColumn& column, int r
Status DataTypeArraySerDe::deserialize_column_from_json_vector(IColumn& column,
std::vector<Slice>& slices,
int* num_deserialized,
const FormatOptions& options,
int nesting_level) const {
const FormatOptions& options) const {
DESERIALIZE_COLUMN_FROM_JSON_VECTOR();
return Status::OK();
}

Status DataTypeArraySerDe::deserialize_one_cell_from_json(IColumn& column, Slice& slice,
const FormatOptions& options,
int nesting_level) const {
const FormatOptions& options) const {
if (slice.empty()) {
return Status::InvalidArgument("slice is empty!");
}
Expand Down Expand Up @@ -142,15 +140,15 @@ Status DataTypeArraySerDe::deserialize_one_cell_from_json(IColumn& column, Slice
}

int elem_deserialized = 0;
Status st = nested_serde->deserialize_column_from_json_vector(
nested_column, slices, &elem_deserialized, options, nesting_level + 1);
Status st = nested_serde->deserialize_column_from_json_vector(nested_column, slices,
&elem_deserialized, options);
offsets.emplace_back(offsets.back() + elem_deserialized);
return st;
}

Status DataTypeArraySerDe::deserialize_one_cell_from_hive_text(IColumn& column, Slice& slice,
const FormatOptions& options,
int nesting_level) const {
Status DataTypeArraySerDe::deserialize_one_cell_from_hive_text(
IColumn& column, Slice& slice, const FormatOptions& options,
int hive_text_complex_type_delimiter_level) const {
if (slice.empty()) {
return Status::InvalidArgument("slice is empty!");
}
Expand All @@ -159,7 +157,8 @@ Status DataTypeArraySerDe::deserialize_one_cell_from_hive_text(IColumn& column,
IColumn& nested_column = array_column.get_data();
DCHECK(nested_column.is_nullable());

char collection_delimiter = options.get_collection_delimiter(nesting_level);
char collection_delimiter =
options.get_collection_delimiter(hive_text_complex_type_delimiter_level);

std::vector<Slice> slices;
for (int idx = 0, start = 0; idx <= slice.size; idx++) {
Expand All @@ -172,23 +171,22 @@ Status DataTypeArraySerDe::deserialize_one_cell_from_hive_text(IColumn& column,

int elem_deserialized = 0;
Status status = nested_serde->deserialize_column_from_hive_text_vector(
nested_column, slices, &elem_deserialized, options, nesting_level + 1);
nested_column, slices, &elem_deserialized, options,
hive_text_complex_type_delimiter_level + 1);
offsets.emplace_back(offsets.back() + elem_deserialized);
return status;
}

Status DataTypeArraySerDe::deserialize_column_from_hive_text_vector(IColumn& column,
std::vector<Slice>& slices,
int* num_deserialized,
const FormatOptions& options,
int nesting_level) const {
Status DataTypeArraySerDe::deserialize_column_from_hive_text_vector(
IColumn& column, std::vector<Slice>& slices, int* num_deserialized,
const FormatOptions& options, int hive_text_complex_type_delimiter_level) const {
DESERIALIZE_COLUMN_FROM_HIVE_TEXT_VECTOR();
return Status::OK();
}

void DataTypeArraySerDe::serialize_one_cell_to_hive_text(const IColumn& column, int row_num,
BufferWritable& bw, FormatOptions& options,
int nesting_level) const {
void DataTypeArraySerDe::serialize_one_cell_to_hive_text(
const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options,
int hive_text_complex_type_delimiter_level) const {
auto result = check_column_const_set_readability(column, row_num);
ColumnPtr ptr = result.first;
row_num = result.second;
Expand All @@ -201,13 +199,13 @@ void DataTypeArraySerDe::serialize_one_cell_to_hive_text(const IColumn& column,

const IColumn& nested_column = data_column.get_data();

char delimiter = options.get_collection_delimiter(nesting_level);
char delimiter = options.get_collection_delimiter(hive_text_complex_type_delimiter_level);
for (size_t i = start; i < end; ++i) {
if (i != start) {
bw.write(delimiter);
}
nested_serde->serialize_one_cell_to_hive_text(nested_column, i, bw, options,
nesting_level + 1);
hive_text_complex_type_delimiter_level + 1);
}
}

Expand Down Expand Up @@ -288,7 +286,8 @@ Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column,
}
}
if (data.is_null_at(j)) {
if (0 != result.push_string("NULL", strlen("NULL"))) {
if (0 != result.push_string(NULL_IN_COMPLEX_TYPE.c_str(),
strlen(NULL_IN_COMPLEX_TYPE.c_str()))) {
return Status::InternalError("pack mysql buffer failed.");
}
} else {
Expand Down
Loading

0 comments on commit fececab

Please sign in to comment.