Coverage Report

Created: 2026-06-25 15:49

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/int_div.cpp
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
// This file is copied from
18
// https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/IntDiv.cpp
19
// and modified by Doris
20
21
#include <libdivide.h>
22
23
#include <limits>
24
#include <utility>
25
26
#include "common/exception.h"
27
#include "core/data_type/data_type_number.h"
28
#include "exprs/function/simple_function_factory.h"
29
30
namespace doris {
31
32
template <typename Impl>
33
class FunctionIntDiv : public IFunction {
34
public:
35
    static constexpr auto name = "int_divide";
36
37
14
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE6createEv
Line
Count
Source
37
2
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE6createEv
Line
Count
Source
37
2
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE6createEv
Line
Count
Source
37
2
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE6createEv
Line
Count
Source
37
6
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE6createEv
Line
Count
Source
37
2
    static FunctionPtr create() { return std::make_shared<FunctionIntDiv>(); }
38
39
14
    FunctionIntDiv() = default;
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEEC2Ev
Line
Count
Source
39
2
    FunctionIntDiv() = default;
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEEC2Ev
Line
Count
Source
39
2
    FunctionIntDiv() = default;
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEEC2Ev
Line
Count
Source
39
2
    FunctionIntDiv() = default;
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEEC2Ev
Line
Count
Source
39
6
    FunctionIntDiv() = default;
_ZN5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEEC2Ev
Line
Count
Source
39
2
    FunctionIntDiv() = default;
40
41
5
    String get_name() const override { return name; }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE8get_nameB5cxx11Ev
Line
Count
Source
41
1
    String get_name() const override { return name; }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE8get_nameB5cxx11Ev
Line
Count
Source
41
1
    String get_name() const override { return name; }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE8get_nameB5cxx11Ev
Line
Count
Source
41
1
    String get_name() const override { return name; }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE8get_nameB5cxx11Ev
Line
Count
Source
41
1
    String get_name() const override { return name; }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE8get_nameB5cxx11Ev
Line
Count
Source
41
1
    String get_name() const override { return name; }
42
43
4
    size_t get_number_of_arguments() const override { return 2; }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE23get_number_of_argumentsEv
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE23get_number_of_argumentsEv
Line
Count
Source
43
4
    size_t get_number_of_arguments() const override { return 2; }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE23get_number_of_argumentsEv
44
45
5
    DataTypes get_variadic_argument_types_impl() const override {
46
5
        return Impl::get_variadic_argument_types();
47
5
    }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE32get_variadic_argument_types_implEv
Line
Count
Source
45
1
    DataTypes get_variadic_argument_types_impl() const override {
46
1
        return Impl::get_variadic_argument_types();
47
1
    }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE32get_variadic_argument_types_implEv
Line
Count
Source
45
1
    DataTypes get_variadic_argument_types_impl() const override {
46
1
        return Impl::get_variadic_argument_types();
47
1
    }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE32get_variadic_argument_types_implEv
Line
Count
Source
45
1
    DataTypes get_variadic_argument_types_impl() const override {
46
1
        return Impl::get_variadic_argument_types();
47
1
    }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE32get_variadic_argument_types_implEv
Line
Count
Source
45
1
    DataTypes get_variadic_argument_types_impl() const override {
46
1
        return Impl::get_variadic_argument_types();
47
1
    }
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE32get_variadic_argument_types_implEv
Line
Count
Source
45
1
    DataTypes get_variadic_argument_types_impl() const override {
46
1
        return Impl::get_variadic_argument_types();
47
1
    }
48
49
4
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
50
4
        DataTypePtr type_res =
51
4
                std::make_shared<typename PrimitiveTypeTraits<Impl::ResultType>::DataType>();
52
4
        return make_nullable(type_res);
53
4
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS9_EE
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS9_EE
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS9_EE
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS9_EE
Line
Count
Source
49
4
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
50
4
        DataTypePtr type_res =
51
4
                std::make_shared<typename PrimitiveTypeTraits<Impl::ResultType>::DataType>();
52
4
        return make_nullable(type_res);
53
4
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS9_EE
54
55
8
    bool use_default_implementation_for_constants() const final { return false; }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE40use_default_implementation_for_constantsEv
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE40use_default_implementation_for_constantsEv
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE40use_default_implementation_for_constantsEv
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE40use_default_implementation_for_constantsEv
Line
Count
Source
55
8
    bool use_default_implementation_for_constants() const final { return false; }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE40use_default_implementation_for_constantsEv
56
57
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
58
4
                        uint32_t result, size_t input_rows_count) const override {
59
4
        auto& column_left = block.get_by_position(arguments[0]).column;
60
4
        auto& column_right = block.get_by_position(arguments[1]).column;
61
4
        bool is_const_left = is_column_const(*column_left);
62
4
        bool is_const_right = is_column_const(*column_right);
63
64
4
        ColumnPtr column_result = nullptr;
65
4
        if (is_const_left && is_const_right) {
66
1
            column_result = constant_constant(column_left, column_right);
67
3
        } else if (is_const_left) {
68
1
            column_result = constant_vector(column_left, column_right);
69
2
        } else if (is_const_right) {
70
1
            column_result = vector_constant(column_left, column_right);
71
1
        } else {
72
1
            column_result = vector_vector(column_left, column_right);
73
1
        }
74
4
        block.replace_by_position(result, std::move(column_result));
75
4
        return Status::OK();
76
4
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
58
4
                        uint32_t result, size_t input_rows_count) const override {
59
4
        auto& column_left = block.get_by_position(arguments[0]).column;
60
4
        auto& column_right = block.get_by_position(arguments[1]).column;
61
4
        bool is_const_left = is_column_const(*column_left);
62
4
        bool is_const_right = is_column_const(*column_right);
63
64
4
        ColumnPtr column_result = nullptr;
65
4
        if (is_const_left && is_const_right) {
66
1
            column_result = constant_constant(column_left, column_right);
67
3
        } else if (is_const_left) {
68
1
            column_result = constant_vector(column_left, column_right);
69
2
        } else if (is_const_right) {
70
1
            column_result = vector_constant(column_left, column_right);
71
1
        } else {
72
1
            column_result = vector_vector(column_left, column_right);
73
1
        }
74
4
        block.replace_by_position(result, std::move(column_result));
75
4
        return Status::OK();
76
4
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
77
78
private:
79
1
    ColumnPtr constant_constant(ColumnPtr column_left, ColumnPtr column_right) const {
80
1
        const auto* column_left_ptr = assert_cast<const ColumnConst*>(column_left.get());
81
1
        const auto* column_right_ptr = assert_cast<const ColumnConst*>(column_right.get());
82
1
        DCHECK(column_left_ptr != nullptr && column_right_ptr != nullptr);
83
84
1
        ColumnPtr column_result = nullptr;
85
86
1
        column_result =
87
1
                Impl::constant_constant(column_left_ptr->template get_value<Impl::ResultType>(),
88
1
                                        column_right_ptr->template get_value<Impl::ResultType>());
89
90
1
        return ColumnConst::create(std::move(column_result), column_left->size());
91
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE17constant_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE17constant_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE17constant_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE17constant_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Line
Count
Source
79
1
    ColumnPtr constant_constant(ColumnPtr column_left, ColumnPtr column_right) const {
80
1
        const auto* column_left_ptr = assert_cast<const ColumnConst*>(column_left.get());
81
1
        const auto* column_right_ptr = assert_cast<const ColumnConst*>(column_right.get());
82
1
        DCHECK(column_left_ptr != nullptr && column_right_ptr != nullptr);
83
84
1
        ColumnPtr column_result = nullptr;
85
86
1
        column_result =
87
1
                Impl::constant_constant(column_left_ptr->template get_value<Impl::ResultType>(),
88
1
                                        column_right_ptr->template get_value<Impl::ResultType>());
89
90
1
        return ColumnConst::create(std::move(column_result), column_left->size());
91
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE17constant_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
92
93
1
    ColumnPtr vector_constant(ColumnPtr column_left, ColumnPtr column_right) const {
94
1
        const auto* column_right_ptr = assert_cast<const ColumnConst*>(column_right.get());
95
1
        DCHECK(column_right_ptr != nullptr);
96
97
1
        return Impl::vector_constant(column_left->get_ptr(),
98
1
                                     column_right_ptr->template get_value<Impl::ResultType>());
99
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Line
Count
Source
93
1
    ColumnPtr vector_constant(ColumnPtr column_left, ColumnPtr column_right) const {
94
1
        const auto* column_right_ptr = assert_cast<const ColumnConst*>(column_right.get());
95
1
        DCHECK(column_right_ptr != nullptr);
96
97
1
        return Impl::vector_constant(column_left->get_ptr(),
98
1
                                     column_right_ptr->template get_value<Impl::ResultType>());
99
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
100
101
1
    ColumnPtr constant_vector(ColumnPtr column_left, ColumnPtr column_right) const {
102
1
        const auto* column_left_ptr = assert_cast<const ColumnConst*>(column_left.get());
103
1
        DCHECK(column_left_ptr != nullptr);
104
105
1
        return Impl::constant_vector(column_left_ptr->template get_value<Impl::ResultType>(),
106
1
                                     column_right->get_ptr());
107
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE15constant_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE15constant_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE15constant_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE15constant_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Line
Count
Source
101
1
    ColumnPtr constant_vector(ColumnPtr column_left, ColumnPtr column_right) const {
102
1
        const auto* column_left_ptr = assert_cast<const ColumnConst*>(column_left.get());
103
1
        DCHECK(column_left_ptr != nullptr);
104
105
1
        return Impl::constant_vector(column_left_ptr->template get_value<Impl::ResultType>(),
106
1
                                     column_right->get_ptr());
107
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE15constant_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
108
109
1
    ColumnPtr vector_vector(ColumnPtr column_left, ColumnPtr column_right) const {
110
1
        return Impl::vector_vector(column_left->get_ptr(), column_right->get_ptr());
111
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE3EEEE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE4EEEE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE5EEEE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
_ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE6EEEE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
Line
Count
Source
109
1
    ColumnPtr vector_vector(ColumnPtr column_left, ColumnPtr column_right) const {
110
1
        return Impl::vector_vector(column_left->get_ptr(), column_right->get_ptr());
111
1
    }
Unexecuted instantiation: _ZNK5doris14FunctionIntDivINS_18DivideIntegralImplILNS_13PrimitiveTypeE7EEEE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS6_EES9_
112
};
113
114
template <PrimitiveType Type>
115
struct DivideIntegralImpl {
116
    using Arg = typename PrimitiveTypeTraits<Type>::CppType;
117
    using ColumnType = typename PrimitiveTypeTraits<Type>::ColumnType;
118
    static constexpr PrimitiveType ResultType = Type;
119
120
5
    static DataTypes get_variadic_argument_types() {
121
5
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
5
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
5
    }
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE27get_variadic_argument_typesEv
Line
Count
Source
120
1
    static DataTypes get_variadic_argument_types() {
121
1
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
1
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
1
    }
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE27get_variadic_argument_typesEv
Line
Count
Source
120
1
    static DataTypes get_variadic_argument_types() {
121
1
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
1
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
1
    }
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE27get_variadic_argument_typesEv
Line
Count
Source
120
1
    static DataTypes get_variadic_argument_types() {
121
1
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
1
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
1
    }
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE27get_variadic_argument_typesEv
Line
Count
Source
120
1
    static DataTypes get_variadic_argument_types() {
121
1
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
1
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
1
    }
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE27get_variadic_argument_typesEv
Line
Count
Source
120
1
    static DataTypes get_variadic_argument_types() {
121
1
        return {std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>(),
122
1
                std::make_shared<typename PrimitiveTypeTraits<Type>::DataType>()};
123
1
    }
124
125
5
    static void throw_if_division_leads_to_fpe(Arg a, Arg b) {
126
5
        if constexpr (std::is_signed_v<Arg>) {
127
5
            if (b == -1 && a == std::numeric_limits<Arg>::min()) {
128
4
                throw Exception(ErrorCode::INVALID_ARGUMENT,
129
4
                                "Division of minimal signed number by minus one is an undefined "
130
4
                                "behavior, {} DIV {}. ",
131
4
                                a, b);
132
4
            }
133
5
        }
134
5
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE30throw_if_division_leads_to_fpeEaa
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE30throw_if_division_leads_to_fpeEss
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE30throw_if_division_leads_to_fpeEii
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE30throw_if_division_leads_to_fpeEll
Line
Count
Source
125
5
    static void throw_if_division_leads_to_fpe(Arg a, Arg b) {
126
5
        if constexpr (std::is_signed_v<Arg>) {
127
5
            if (b == -1 && a == std::numeric_limits<Arg>::min()) {
128
4
                throw Exception(ErrorCode::INVALID_ARGUMENT,
129
4
                                "Division of minimal signed number by minus one is an undefined "
130
4
                                "behavior, {} DIV {}. ",
131
4
                                a, b);
132
4
            }
133
5
        }
134
5
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE30throw_if_division_leads_to_fpeEnn
135
136
    static void apply(const typename ColumnType::Container& a, Arg b,
137
                      typename PrimitiveTypeTraits<ResultType>::ColumnType::Container& c,
138
1
                      PaddedPODArray<UInt8>& null_map) {
139
1
        size_t size = c.size();
140
1
        UInt8 is_null = b == 0;
141
1
        memset(null_map.data(), is_null, size);
142
143
1
        if (!is_null) {
144
1
            if constexpr (std::is_signed_v<Arg>) {
145
1
                if (b == -1) {
146
2
                    for (size_t i = 0; i < size; i++) {
147
1
                        throw_if_division_leads_to_fpe(a[i], b);
148
1
                    }
149
1
                }
150
1
            }
151
            if constexpr (!std::is_floating_point_v<Arg> && !std::is_same_v<Arg, Int128> &&
152
1
                          !std::is_same_v<Arg, Int8> && !std::is_same_v<Arg, UInt8>) {
153
1
                const auto divider = libdivide::divider<Arg>(Arg(b));
154
1
                for (size_t i = 0; i < size; i++) {
155
0
                    c[i] = a[i] / divider;
156
0
                }
157
1
            } else {
158
0
                for (size_t i = 0; i < size; i++) {
159
0
                    c[i] = typename PrimitiveTypeTraits<ResultType>::CppType(a[i] / b);
160
0
                }
161
0
            }
162
1
        }
163
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE5applyERKNS_8PODArrayIaLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEaRS7_RNS3_IhLm4096ES6_Lm16ELm15EEE
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE5applyERKNS_8PODArrayIsLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEsRS7_RNS3_IhLm4096ES6_Lm16ELm15EEE
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE5applyERKNS_8PODArrayIiLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEiRS7_RNS3_IhLm4096ES6_Lm16ELm15EEE
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE5applyERKNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEElRS7_RNS3_IhLm4096ES6_Lm16ELm15EEE
Line
Count
Source
138
1
                      PaddedPODArray<UInt8>& null_map) {
139
1
        size_t size = c.size();
140
1
        UInt8 is_null = b == 0;
141
1
        memset(null_map.data(), is_null, size);
142
143
1
        if (!is_null) {
144
1
            if constexpr (std::is_signed_v<Arg>) {
145
1
                if (b == -1) {
146
2
                    for (size_t i = 0; i < size; i++) {
147
1
                        throw_if_division_leads_to_fpe(a[i], b);
148
1
                    }
149
1
                }
150
1
            }
151
            if constexpr (!std::is_floating_point_v<Arg> && !std::is_same_v<Arg, Int128> &&
152
1
                          !std::is_same_v<Arg, Int8> && !std::is_same_v<Arg, UInt8>) {
153
1
                const auto divider = libdivide::divider<Arg>(Arg(b));
154
1
                for (size_t i = 0; i < size; i++) {
155
0
                    c[i] = a[i] / divider;
156
0
                }
157
            } else {
158
                for (size_t i = 0; i < size; i++) {
159
                    c[i] = typename PrimitiveTypeTraits<ResultType>::CppType(a[i] / b);
160
                }
161
            }
162
1
        }
163
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE5applyERKNS_8PODArrayInLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEnRS7_RNS3_IhLm4096ES6_Lm16ELm15EEE
164
165
    static inline typename PrimitiveTypeTraits<ResultType>::CppType apply(Arg a, Arg b,
166
4
                                                                          UInt8& is_null) {
167
4
        is_null = b == 0;
168
4
        b += is_null;
169
4
        throw_if_division_leads_to_fpe(a, b);
170
4
        return typename PrimitiveTypeTraits<ResultType>::CppType(a / b);
171
4
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE5applyEaaRh
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE5applyEssRh
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE5applyEiiRh
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE5applyEllRh
Line
Count
Source
166
4
                                                                          UInt8& is_null) {
167
4
        is_null = b == 0;
168
4
        b += is_null;
169
4
        throw_if_division_leads_to_fpe(a, b);
170
4
        return typename PrimitiveTypeTraits<ResultType>::CppType(a / b);
171
4
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE5applyEnnRh
172
173
1
    static ColumnPtr constant_constant(Arg a, Arg b) {
174
1
        auto column_result = ColumnType ::create(1);
175
176
1
        auto null_map = ColumnUInt8::create(1, 0);
177
1
        column_result->get_element(0) = apply(a, b, null_map->get_element(0));
178
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
179
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE17constant_constantEaa
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE17constant_constantEss
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE17constant_constantEii
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE17constant_constantEll
Line
Count
Source
173
1
    static ColumnPtr constant_constant(Arg a, Arg b) {
174
1
        auto column_result = ColumnType ::create(1);
175
176
1
        auto null_map = ColumnUInt8::create(1, 0);
177
1
        column_result->get_element(0) = apply(a, b, null_map->get_element(0));
178
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
179
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE17constant_constantEnn
180
181
1
    static ColumnPtr vector_constant(ColumnPtr column_left, Arg b) {
182
1
        const auto* column_left_ptr = assert_cast<const ColumnType*>(column_left.get());
183
1
        auto column_result = ColumnType::create(column_left->size());
184
1
        DCHECK(column_left_ptr != nullptr);
185
186
1
        auto null_map = ColumnUInt8::create(column_left->size(), 0);
187
1
        apply(column_left_ptr->get_data(), b, column_result->get_data(), null_map->get_data());
188
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
189
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS4_EEa
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS4_EEs
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS4_EEi
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS4_EEl
Line
Count
Source
181
1
    static ColumnPtr vector_constant(ColumnPtr column_left, Arg b) {
182
1
        const auto* column_left_ptr = assert_cast<const ColumnType*>(column_left.get());
183
1
        auto column_result = ColumnType::create(column_left->size());
184
1
        DCHECK(column_left_ptr != nullptr);
185
186
1
        auto null_map = ColumnUInt8::create(column_left->size(), 0);
187
1
        apply(column_left_ptr->get_data(), b, column_result->get_data(), null_map->get_data());
188
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
189
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE15vector_constantENS_3COWINS_7IColumnEE13immutable_ptrIS4_EEn
190
191
1
    static ColumnPtr constant_vector(Arg a, ColumnPtr column_right) {
192
1
        const auto* column_right_ptr = assert_cast<const ColumnType*>(column_right.get());
193
1
        auto column_result = ColumnType::create(column_right->size());
194
1
        DCHECK(column_right_ptr != nullptr);
195
196
1
        auto null_map = ColumnUInt8::create(column_right->size(), 0);
197
1
        auto& b = column_right_ptr->get_data();
198
1
        auto& c = column_result->get_data();
199
1
        auto& n = null_map->get_data();
200
1
        size_t size = b.size();
201
2
        for (size_t i = 0; i < size; ++i) {
202
1
            c[i] = apply(a, b[i], n[i]);
203
1
        }
204
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
205
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE15constant_vectorEaNS_3COWINS_7IColumnEE13immutable_ptrIS4_EE
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE15constant_vectorEsNS_3COWINS_7IColumnEE13immutable_ptrIS4_EE
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE15constant_vectorEiNS_3COWINS_7IColumnEE13immutable_ptrIS4_EE
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE15constant_vectorElNS_3COWINS_7IColumnEE13immutable_ptrIS4_EE
Line
Count
Source
191
1
    static ColumnPtr constant_vector(Arg a, ColumnPtr column_right) {
192
1
        const auto* column_right_ptr = assert_cast<const ColumnType*>(column_right.get());
193
1
        auto column_result = ColumnType::create(column_right->size());
194
1
        DCHECK(column_right_ptr != nullptr);
195
196
1
        auto null_map = ColumnUInt8::create(column_right->size(), 0);
197
1
        auto& b = column_right_ptr->get_data();
198
1
        auto& c = column_result->get_data();
199
1
        auto& n = null_map->get_data();
200
1
        size_t size = b.size();
201
2
        for (size_t i = 0; i < size; ++i) {
202
1
            c[i] = apply(a, b[i], n[i]);
203
1
        }
204
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
205
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE15constant_vectorEnNS_3COWINS_7IColumnEE13immutable_ptrIS4_EE
206
207
1
    static ColumnPtr vector_vector(ColumnPtr column_left, ColumnPtr column_right) {
208
1
        const auto* column_left_ptr = assert_cast<const ColumnType*>(column_left.get());
209
1
        const auto* column_right_ptr = assert_cast<const ColumnType*>(column_right.get());
210
211
1
        auto column_result = ColumnType::create(column_left->size());
212
1
        DCHECK(column_left_ptr != nullptr && column_right_ptr != nullptr);
213
214
1
        auto null_map = ColumnUInt8::create(column_result->size(), 0);
215
1
        auto& a = column_left_ptr->get_data();
216
1
        auto& b = column_right_ptr->get_data();
217
1
        auto& c = column_result->get_data();
218
1
        auto& n = null_map->get_data();
219
1
        size_t size = a.size();
220
3
        for (size_t i = 0; i < size; ++i) {
221
2
            c[i] = apply(a[i], b[i], n[i]);
222
2
        }
223
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
224
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE3EE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS4_EES7_
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE4EE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS4_EES7_
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE5EE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS4_EES7_
_ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE6EE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS4_EES7_
Line
Count
Source
207
1
    static ColumnPtr vector_vector(ColumnPtr column_left, ColumnPtr column_right) {
208
1
        const auto* column_left_ptr = assert_cast<const ColumnType*>(column_left.get());
209
1
        const auto* column_right_ptr = assert_cast<const ColumnType*>(column_right.get());
210
211
1
        auto column_result = ColumnType::create(column_left->size());
212
1
        DCHECK(column_left_ptr != nullptr && column_right_ptr != nullptr);
213
214
1
        auto null_map = ColumnUInt8::create(column_result->size(), 0);
215
1
        auto& a = column_left_ptr->get_data();
216
1
        auto& b = column_right_ptr->get_data();
217
1
        auto& c = column_result->get_data();
218
1
        auto& n = null_map->get_data();
219
1
        size_t size = a.size();
220
3
        for (size_t i = 0; i < size; ++i) {
221
2
            c[i] = apply(a[i], b[i], n[i]);
222
2
        }
223
1
        return ColumnNullable::create(std::move(column_result), std::move(null_map));
224
1
    }
Unexecuted instantiation: _ZN5doris18DivideIntegralImplILNS_13PrimitiveTypeE7EE13vector_vectorENS_3COWINS_7IColumnEE13immutable_ptrIS4_EES7_
225
};
226
227
1
void register_function_int_div(SimpleFunctionFactory& factory) {
228
1
    factory.register_function<FunctionIntDiv<DivideIntegralImpl<TYPE_TINYINT>>>();
229
1
    factory.register_function<FunctionIntDiv<DivideIntegralImpl<TYPE_SMALLINT>>>();
230
1
    factory.register_function<FunctionIntDiv<DivideIntegralImpl<TYPE_INT>>>();
231
1
    factory.register_function<FunctionIntDiv<DivideIntegralImpl<TYPE_BIGINT>>>();
232
1
    factory.register_function<FunctionIntDiv<DivideIntegralImpl<TYPE_LARGEINT>>>();
233
1
}
234
235
} // namespace doris