From e610044bae59d64894e8482175c1ac49cfdb69a8 Mon Sep 17 00:00:00 2001 From: Luwei <814383175@qq.com> Date: Thu, 28 Dec 2023 17:11:24 +0800 Subject: [PATCH] [Enhancement] (schema) add column type check (#28718) --- be/src/common/config.cpp | 1 + be/src/common/config.h | 2 ++ be/src/olap/rowset/segment_v2/column_reader.h | 2 ++ be/src/olap/rowset/segment_v2/segment.cpp | 10 ++++++++++ 4 files changed, 15 insertions(+) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 358db99e59..42a9530212 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1144,6 +1144,7 @@ DEFINE_Bool(enable_snapshot_action, "false"); DEFINE_mInt32(variant_max_merged_tablet_schema_size, "2048"); +DEFINE_mBool(enable_column_type_check, "true"); // 128 MB DEFINE_mInt64(local_exchange_buffer_mem_limit, "134217728"); diff --git a/be/src/common/config.h b/be/src/common/config.h index a41a3d0614..d38e059c41 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1223,6 +1223,8 @@ DECLARE_mInt32(variant_max_merged_tablet_schema_size); DECLARE_mInt64(local_exchange_buffer_mem_limit); +DECLARE_mBool(enable_column_type_check); + #ifdef BE_TEST // test s3 DECLARE_String(test_s3_resource); diff --git a/be/src/olap/rowset/segment_v2/column_reader.h b/be/src/olap/rowset/segment_v2/column_reader.h index 99ff231080..78cd016453 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.h +++ b/be/src/olap/rowset/segment_v2/column_reader.h @@ -182,6 +182,8 @@ public: void disable_index_meta_cache() { _use_index_page_cache = false; } + FieldType get_meta_type() { return _meta_type; } + private: ColumnReader(const ColumnReaderOptions& opts, const ColumnMetaPB& meta, uint64_t num_rows, io::FileReaderSPtr file_reader); diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 1f9956e5e6..b7d3a4ca0f 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -524,6 +524,16 @@ Status Segment::new_column_iterator(const TabletColumn& tablet_column, ColumnIterator* it; RETURN_IF_ERROR(_column_readers.at(tablet_column.unique_id())->new_iterator(&it)); iter->reset(it); + + if (config::enable_column_type_check && + tablet_column.type() != _column_readers.at(tablet_column.unique_id())->get_meta_type()) { + LOG(WARNING) << "different type between schema and column reader," + << " column schema name: " << tablet_column.name() + << " column schema type: " << int(tablet_column.type()) + << " column reader meta type" + << int(_column_readers.at(tablet_column.unique_id())->get_meta_type()); + return Status::InternalError("different type between schema and column reader"); + } return Status::OK(); }