diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp b/be/src/olap/rowset/segment_v2/column_reader.cpp index fa5299df2f0030..f5833ee5734899 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.cpp +++ b/be/src/olap/rowset/segment_v2/column_reader.cpp @@ -464,6 +464,9 @@ Status ColumnReader::next_batch_of_zone_map(size_t* n, vectorized::MutableColumn } else { if (is_string) { auto sv = (StringRef*)max_value->cell_ptr(); + if (type == FieldType::OLAP_FIELD_TYPE_CHAR) { + *sv = sv->trim_tail_padding_zero(); + } dst->insert_data(sv->data, sv->size); } else { dst->insert_many_fix_len_data(static_cast(max_value->cell_ptr()), 1); @@ -476,6 +479,9 @@ Status ColumnReader::next_batch_of_zone_map(size_t* n, vectorized::MutableColumn } else { if (is_string) { auto sv = (StringRef*)min_value->cell_ptr(); + if (type == FieldType::OLAP_FIELD_TYPE_CHAR) { + *sv = sv->trim_tail_padding_zero(); + } dst->insert_data_repeatedly(sv->data, sv->size, size); } else { // TODO: the work may cause performance problem, opt latter diff --git a/be/src/pipeline/exec/cache_source_operator.h b/be/src/pipeline/exec/cache_source_operator.h index 49f0c376c47cbe..984288b04f7cd9 100644 --- a/be/src/pipeline/exec/cache_source_operator.h +++ b/be/src/pipeline/exec/cache_source_operator.h @@ -58,8 +58,8 @@ class CacheSourceLocalState final : public PipelineXLocalState _local_cache_blocks; std::vector _slot_orders; - size_t _current_query_cache_bytes = 0; - size_t _current_query_cache_rows = 0; + int64_t _current_query_cache_bytes = 0; + int64_t _current_query_cache_rows = 0; bool _need_insert_cache = true; QueryCacheHandle _query_cache_handle; diff --git a/be/src/vec/common/string_ref.cpp b/be/src/vec/common/string_ref.cpp index 864d2454e64cbd..bac052e741f581 100644 --- a/be/src/vec/common/string_ref.cpp +++ b/be/src/vec/common/string_ref.cpp @@ -41,6 +41,17 @@ StringRef StringRef::trim() const { return StringRef(data + begin, end - begin + 1); } +StringRef StringRef::trim_tail_padding_zero() const { + // Remove trailing padding zero. + int64_t end = size - 1; + + while (end >= 0 && data[end] == '\0') { + --end; + } + + return StringRef(data, end + 1); +} + StringRef StringRef::trim_whitespace() const { // Remove leading and trailing whitespace. int64_t begin = 0; diff --git a/be/src/vec/common/string_ref.h b/be/src/vec/common/string_ref.h index 508399c4af9f93..27ab1137fc3bb0 100644 --- a/be/src/vec/common/string_ref.h +++ b/be/src/vec/common/string_ref.h @@ -220,6 +220,7 @@ struct StringRef { // Trims leading and trailing spaces. StringRef trim() const; + StringRef trim_tail_padding_zero() const; StringRef trim_whitespace() const; StringRef trim_quote() const; diff --git a/regression-test/data/query_p0/aggregate/support_type/max/max.out b/regression-test/data/query_p0/aggregate/support_type/max/max.out index 01e6a911dd045c..4bcd72cd160568 100644 Binary files a/regression-test/data/query_p0/aggregate/support_type/max/max.out and b/regression-test/data/query_p0/aggregate/support_type/max/max.out differ diff --git a/regression-test/data/query_p0/aggregate/support_type/min/min.out b/regression-test/data/query_p0/aggregate/support_type/min/min.out index 11847e951e8c2c..0c0893e375c554 100644 Binary files a/regression-test/data/query_p0/aggregate/support_type/min/min.out and b/regression-test/data/query_p0/aggregate/support_type/min/min.out differ diff --git a/regression-test/suites/query_p0/aggregate/support_type/min/min.groovy b/regression-test/suites/query_p0/aggregate/support_type/min/min.groovy index b5fd8ff4b59bcd..5b00298e2743c5 100644 --- a/regression-test/suites/query_p0/aggregate/support_type/min/min.groovy +++ b/regression-test/suites/query_p0/aggregate/support_type/min/min.groovy @@ -97,6 +97,9 @@ suite("min") { qt_min_double """select min(col_double) from d_table;""" qt_min_char """select min(col_char) from d_table;""" + // Test length(min(col_char)) with different disable_nereids_rules settings + sql "set disable_nereids_rules='';" + qt_min_char_length_default """select length(min(col_char)) from d_table;""" qt_min_varchar """select min(col_varchar) from d_table;""" qt_min_string """select min(col_string) from d_table;""" @@ -110,4 +113,4 @@ suite("min") { qt_min_ipv4 """select min(col_ipv4) from d_table;""" qt_min_ipv6 """select min(col_ipv6) from d_table;""" -} \ No newline at end of file +}