[Debug](Variant) sanitize variant in write_column_to_mysql (#29380)

This commit is contained in:
lihangyu
2024-01-02 20:28:59 +08:00
committed by GitHub
parent 243b075eef
commit 9490d5e9a2
3 changed files with 41 additions and 0 deletions

View File

@ -27,6 +27,8 @@
#include <rapidjson/stringbuffer.h>
#include <rapidjson/writer.h>
#include <algorithm>
#include <cstdlib>
#include <functional>
#include <limits>
#include <map>
@ -1473,4 +1475,36 @@ void ColumnObject::for_each_imutable_subcolumn(ImutableColumnCallback callback)
}
}
std::string ColumnObject::debug_string() const {
std::stringstream res;
res << get_family_name() << "(num_row = " << num_rows;
for (auto& entry : subcolumns) {
if (entry->data.is_finalized()) {
res << "[column:" << entry->data.data[0]->dump_structure()
<< ",type:" << entry->data.data_types[0]->get_name()
<< ",path:" << entry->path.get_path() << "],";
}
}
res << ")";
return res.str();
}
Status ColumnObject::sanitize() const {
RETURN_IF_CATCH_EXCEPTION(check_consistency());
for (const auto& subcolumn : subcolumns) {
if (subcolumn->data.is_finalized()) {
auto column = subcolumn->data.get_least_common_type()->create_column();
std::string original = subcolumn->data.get_finalized_column().get_family_name();
std::string expected = column->get_family_name();
if (original != expected) {
return Status::InternalError("Incompatible type between {} and {}, debug_info:",
original, expected, debug_string());
}
}
}
VLOG_DEBUG << "sanitized " << debug_string();
return Status::OK();
}
} // namespace doris::vectorized

View File

@ -476,5 +476,10 @@ public:
void strip_outer_array();
bool empty() const;
// Check if all columns and types are aligned
Status sanitize() const;
std::string debug_string() const;
};
} // namespace doris::vectorized

View File

@ -19,6 +19,7 @@
#include <rapidjson/stringbuffer.h>
#include "common/status.h"
#include "vec/columns/column_object.h"
#include "vec/common/assert_cast.h"
#include "vec/common/schema_util.h"
@ -34,6 +35,7 @@ Status DataTypeObjectSerDe::write_column_to_mysql(const IColumn& column,
if (!variant.is_finalized()) {
const_cast<ColumnObject&>(variant).finalize();
}
RETURN_IF_ERROR(variant.sanitize());
if (variant.is_scalar_variant()) {
// Serialize scalar types, like int, string, array, faster path
const auto& root = variant.get_subcolumn({});