diff --git a/be/src/olap/predicate_creator.h b/be/src/olap/predicate_creator.h index 056ad38ae5e6a1..eb9dbcbbc2c9f0 100644 --- a/be/src/olap/predicate_creator.h +++ b/be/src/olap/predicate_creator.h @@ -218,24 +218,28 @@ std::shared_ptr create_comparison_predicate0( } case TYPE_CHAR: { // TODO(gabriel): Use std::string instead of StringRef - size_t target = assert_cast( - vectorized::remove_nullable(data_type).get()) - ->len(); - StringRef v = value; - if (target > value.size) { - char* buffer = arena.alloc(target); - memset(buffer, 0, target); - memcpy(buffer, value.data, value.size); - v = {buffer, target}; - } - + auto target = + std::max(cast_set(assert_cast( + vectorized::remove_nullable(data_type).get()) + ->len()), + value.size); + char* buffer = arena.alloc(target); + memset(buffer, 0, target); + memcpy(buffer, value.data, value.size); + StringRef v = {buffer, target}; return ComparisonPredicateBase::create_shared(cid, v, opposite); } case TYPE_VARCHAR: { - return ComparisonPredicateBase::create_shared(cid, value, opposite); + char* buffer = arena.alloc(value.size); + memcpy(buffer, value.data, value.size); + StringRef v = {buffer, value.size}; + return ComparisonPredicateBase::create_shared(cid, v, opposite); } case TYPE_STRING: { - return ComparisonPredicateBase::create_shared(cid, value, opposite); + char* buffer = arena.alloc(value.size); + memcpy(buffer, value.data, value.size); + StringRef v = {buffer, value.size}; + return ComparisonPredicateBase::create_shared(cid, v, opposite); } case TYPE_DATE: { return ComparisonPredicateBase::create_shared(