From 5867d28716c790435d0ce529816459601becf9f6 Mon Sep 17 00:00:00 2001 From: Hooper9973 Date: Wed, 8 Nov 2023 18:43:02 +0000 Subject: [PATCH] Fix Int diff pushdown filter value overflow --- .../encoding/ob_integer_base_diff_decoder.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/storage/blocksstable/encoding/ob_integer_base_diff_decoder.cpp b/src/storage/blocksstable/encoding/ob_integer_base_diff_decoder.cpp index 978782bf6..8f6683395 100644 --- a/src/storage/blocksstable/encoding/ob_integer_base_diff_decoder.cpp +++ b/src/storage/blocksstable/encoding/ob_integer_base_diff_decoder.cpp @@ -352,6 +352,7 @@ int ObIntegerBaseDiffDecoder::comparison_operator( int ret = OB_SUCCESS; uint64_t delta_value = 0; uint64_t param_delta_value = 0; + common::ObObjMeta filter_val_meta; if (OB_UNLIKELY(pd_filter_info.count_ != result_bitmap.size() || NULL == col_data || filter.get_datums().count() != 1)) { @@ -363,6 +364,8 @@ int ObIntegerBaseDiffDecoder::comparison_operator( // Can't compare by uint directly, support this later with float point number compare later ret = OB_NOT_SUPPORTED; LOG_DEBUG("Double/Float with INT_DIFF encoding, back to retro path", K(col_ctx)); + } else if (OB_FAIL(filter.get_filter_node().get_filter_val_meta(filter_val_meta))) { + LOG_WARN("Fail to find datum meta", K(ret), K(filter)); } else { const ObDatum &ref_datum = filter.get_datums().at(0); ObStorageDatum base_datum; @@ -401,17 +404,17 @@ int ObIntegerBaseDiffDecoder::comparison_operator( int64_t data_offset = 0; bool null_value_contained = result_bitmap.popcnt() > 0; bool exist_parent_filter = nullptr != parent; - const ObObjType &obj_type = col_ctx.obj_meta_.get_type(); + const ObObjType &ref_obj_type = filter_val_meta.get_type(); if (col_ctx.has_extend_value()) { data_offset = col_ctx.micro_block_header_->row_count_ * col_ctx.micro_block_header_->extend_value_bit_; } if (ObIntSC == column_sc) { - if (OB_FAIL(get_delta(obj_type, ref_datum, param_delta_value))) { + if (OB_FAIL(get_delta(ref_obj_type, ref_datum, param_delta_value))) { LOG_WARN("Failed to get delta value", K(ret), K(ref_datum)); } } else if (ObUIntSC == column_sc) { - if (OB_FAIL(get_delta(obj_type, ref_datum, param_delta_value))) { + if (OB_FAIL(get_delta(ref_obj_type, ref_datum, param_delta_value))) { LOG_WARN("Failed to get delta value", K(ret), K(ref_datum)); } } else {