From 21a42ea0876bc1ed5ae7e2b6e501e547057a241f Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Tue, 7 Dec 2021 15:31:08 +0800 Subject: [PATCH] Support cast varchar to HLL (#1920) --- be/src/exprs/vectorized/cast_expr.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/be/src/exprs/vectorized/cast_expr.cpp b/be/src/exprs/vectorized/cast_expr.cpp index e2912356cb621a..63d0c494ac12ef 100644 --- a/be/src/exprs/vectorized/cast_expr.cpp +++ b/be/src/exprs/vectorized/cast_expr.cpp @@ -14,6 +14,7 @@ #include "exprs/vectorized/unary_function.h" #include "gutil/strings/substitute.h" #include "runtime/runtime_state.h" +#include "storage/hll.h" #include "util/date_func.h" namespace starrocks { @@ -134,6 +135,28 @@ ColumnPtr cast_fn(ColumnPtr& column) { return builder.build(column->is_constant()); } +template <> +ColumnPtr cast_fn(ColumnPtr& column) { + ColumnBuilder builder; + ColumnViewer viewer(column); + for (int row = 0; row < viewer.size(); ++row) { + if (viewer.is_null(row)) { + builder.append_null(); + continue; + } + + auto value = viewer.value(row); + if (!HyperLogLog::is_valid(value)) { + builder.append_null(); + } else { + HyperLogLog hll; + hll.deserialize(value); + builder.append(&hll); + } + } + + return builder.build(column->is_constant()); +} // all int(tinyint, smallint, int, bigint, largeint) cast implements DEFINE_UNARY_FN_WITH_IMPL(ImplicitToNumber, value) { return value; @@ -1006,6 +1029,10 @@ Expr* VectorizedCastExprFactory::from_thrift(const TExprNode& node) { from_type = to_type; } + if (from_type == TYPE_VARCHAR && to_type == TYPE_HLL) { + return new VectorizedCastExpr(node); + } + if (to_type == TYPE_VARCHAR) { switch (from_type) { CASE_TO_STRING_FROM(TYPE_BOOLEAN);