(functions) optimize const_column to full convert
This commit is contained in:
@ -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";
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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())) {
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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 """
|
||||
|
||||
Reference in New Issue
Block a user