(functions) optimize const_column to full convert

This commit is contained in:
ZhaoChangle
2023-03-15 10:57:03 +08:00
committed by GitHub
parent 85080ee3c3
commit 66f3ef568e
11 changed files with 35 additions and 30 deletions

View File

@ -22,6 +22,7 @@
#include "vec/utils/util.hpp"
namespace doris::vectorized {
//TODO: add manual info to docs.
class FunctionEqForNull : public IFunction {
public:
static constexpr auto name = "eq_for_null";

View File

@ -272,8 +272,7 @@ public:
auto& null_map = res_null_map->get_data();
auto& res = res_data_column->get_data();
ColumnPtr argument_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& argument_column = block.get_by_position(arguments[0]).column;
if constexpr (std::is_same_v<typename Impl::ArgumentType, DataTypeString>) {
const auto& str_column = static_cast<const ColumnString&>(*argument_column);
const ColumnString::Chars& data = str_column.get_chars();
@ -413,7 +412,7 @@ public:
auto data_null_map = ColumnUInt8::create(input_rows_count, 0);
auto& null_map = data_null_map->get_data();
auto column = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
auto& column = block.get_by_position(arguments[0]).column;
if (auto* nullable = check_and_get_column<const ColumnNullable>(*column)) {
VectorizedUtils::update_null_map(null_map, nullable->get_null_map_data());
column = nullable->get_nested_column_ptr();
@ -731,6 +730,7 @@ public:
size_t get_number_of_arguments() const override { return 1; }
bool use_default_implementation_for_nulls() const override { return true; }
bool use_default_implementation_for_constants() const override { return true; }
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
@ -744,8 +744,7 @@ public:
dest_nested_column = dest_nested_nullable_col->get_nested_column_ptr();
auto& dest_nested_null_map = dest_nested_nullable_col->get_null_map_column().get_data();
auto arg_col =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
auto& arg_col = block.get_by_position(arguments[0]).column;
auto bitmap_col = assert_cast<const ColumnBitmap*>(arg_col.get());
const auto& bitmap_col_data = bitmap_col->get_data();
auto& nested_column_data =

View File

@ -56,8 +56,7 @@ public:
auto result_column = ColumnInt64::create();
auto result_null_map_column = ColumnUInt8::create(input_rows_count, 0);
ColumnPtr argument_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& argument_column = block.get_by_position(arguments[0]).column;
if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_column)) {
// Danger: Here must dispose the null map data first! Because
// argument_columns[i]=nullable->get_nested_column_ptr(); will release the mem

View File

@ -46,8 +46,7 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
ColumnPtr argument_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& argument_column = block.get_by_position(arguments[0]).column;
auto result_data_column = ColumnString::create();
auto& result_data = result_data_column->get_chars();

View File

@ -45,8 +45,7 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
ColumnPtr src_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& src_column = block.get_by_position(arguments[0]).column;
if (const ColumnString* col_string = check_and_get_column<ColumnString>(src_column.get())) {
auto col_res = ColumnString::create();
ReverseImpl::vector(col_string->get_chars(), col_string->get_offsets(),

View File

@ -313,7 +313,7 @@ public:
String get_name() const override { return name; }
bool use_default_implementation_for_constants() const override { return false; }
bool use_default_implementation_for_constants() const override { return true; }
size_t get_number_of_arguments() const override { return 1; }
@ -327,8 +327,7 @@ public:
size_t result, size_t input_rows_count) override {
auto null_map = ColumnUInt8::create(input_rows_count, 0);
ColumnPtr argument_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& argument_column = block.get_by_position(arguments[0]).column;
auto data_col = assert_cast<const ColumnVector<Int32>*>(argument_column.get());
ColumnPtr res_column;

View File

@ -423,8 +423,7 @@ public:
size_t result, size_t input_rows_count) override {
auto null_map = ColumnUInt8::create(input_rows_count, 0);
auto col_ptr =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
auto& col_ptr = block.get_by_position(arguments[0]).column;
auto res = Impl::ColumnType::create();
if (const ColumnString* col = check_and_get_column<ColumnString>(col_ptr.get())) {

View File

@ -44,8 +44,7 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
ColumnPtr argument_column =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
ColumnPtr& argument_column = block.get_by_position(arguments[0]).column;
auto res_column = ColumnUInt8::create();

View File

@ -78,10 +78,9 @@ struct StAsText {
DCHECK_EQ(arguments.size(), 1);
auto return_type = remove_nullable(block.get_data_type(result));
auto input = block.get_by_position(arguments[0]).column;
auto& input = block.get_by_position(arguments[0]).column;
auto size = input->size();
auto col = input->convert_to_full_column_if_const();
MutableColumnPtr res = nullptr;
auto null_type = std::reinterpret_pointer_cast<const DataTypeNullable>(return_type);
@ -89,7 +88,7 @@ struct StAsText {
std::unique_ptr<GeoShape> shape;
for (int row = 0; row < size; ++row) {
auto shape_value = col->get_data_at(row);
auto shape_value = input->get_data_at(row);
shape.reset(GeoShape::from_encoded(shape_value.data, shape_value.size));
if (shape == nullptr) {
@ -113,10 +112,9 @@ struct StX {
DCHECK_EQ(arguments.size(), 1);
auto return_type = remove_nullable(block.get_data_type(result));
auto input = block.get_by_position(arguments[0]).column;
auto& input = block.get_by_position(arguments[0]).column;
auto size = input->size();
auto col = input->convert_to_full_column_if_const();
MutableColumnPtr res = nullptr;
auto null_type = std::reinterpret_pointer_cast<const DataTypeNullable>(return_type);
@ -124,7 +122,7 @@ struct StX {
GeoPoint point;
for (int row = 0; row < size; ++row) {
auto point_value = col->get_data_at(row);
auto point_value = input->get_data_at(row);
auto pt = point.decode_from(point_value.data, point_value.size);
if (!pt) {
@ -148,10 +146,9 @@ struct StY {
DCHECK_EQ(arguments.size(), 1);
auto return_type = remove_nullable(block.get_data_type(result));
auto input = block.get_by_position(arguments[0]).column;
auto& input = block.get_by_position(arguments[0]).column;
auto size = input->size();
auto col = input->convert_to_full_column_if_const();
MutableColumnPtr res = nullptr;
auto null_type = std::reinterpret_pointer_cast<const DataTypeNullable>(return_type);
@ -159,7 +156,7 @@ struct StY {
GeoPoint point;
for (int row = 0; row < size; ++row) {
auto point_value = col->get_data_at(row);
auto point_value = input->get_data_at(row);
auto pt = point.decode_from(point_value.data, point_value.size);
if (!pt) {
@ -352,7 +349,7 @@ struct StGeoFromText {
size_t result) {
DCHECK_EQ(arguments.size(), 1);
auto return_type = remove_nullable(block.get_data_type(result));
auto geo = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
auto& geo = block.get_by_position(arguments[0]).column;
const auto size = geo->size();
auto null_type = std::reinterpret_pointer_cast<const DataTypeNullable>(return_type);

View File

@ -5,6 +5,20 @@
-- !select --
1 1 1 1 1 3 1 2 1 1 1 1 1 2 1 1 1
-- !select --
1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
1 false 10 20 30 4444444444444 55555555555 0.1 0.222 3333.33 c varchar1 string1 2022-12-01 2022-12-01 2022-12-01T22:23:23 2022-12-01T22:23:24.999999 not null
1 false 11 21 33 4444444444444 55555555555 0.1 0.222 3333.33 c varchar1 string1 2022-12-01 2022-12-01 2022-12-01T22:23:23 2022-12-01T22:23:24.999999 not null
1 true 11 12 13 1444444444444 1555555555 1.1 1.222 13333.33 d varchar2 string2 2022-12-02 2022-12-02 2022-12-02T22:23:23 2022-12-02T22:23:24.999999 not null
2 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
2 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
2 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N not null
2 false 10 20 30 944444444444 9555555555 9.1 9.222 93333.33 p varchar9 string9 2022-12-09 2022-12-09 2022-12-09T22:23:23 2022-12-09T22:23:24.999999 not null
2 false 21 22 23 2444444444444 255555555 2.1 2.222 23333.33 f varchar3 string3 2022-12-03 2022-12-03 2022-12-03T22:23:23 2022-12-03T22:23:24.999999 not null
2 true 31 32 33 3444444444444 3555555555 3.1 3.222 33333.33 l varchar3 string3 2022-12-03 2022-12-03 2022-12-03T22:23:23 2022-12-03T22:23:24.999999 not null
-- !select --
1 1 1 1 1 3 1 2 1 1 1 1 1 2 1 1 1

View File

@ -402,8 +402,8 @@ suite("test_aggregate_collect") {
'2022-12-09', '2022-12-09', '2022-12-09 22:23:23', '2022-12-09 22:23:24.999999', 'not null')
"""
sql """
SELECT * FROM ${tableName_11}
qt_select """
SELECT * FROM ${tableName_11} ORDER BY c_id, c_tinyint, c_char;
"""
sql """