github-actions[bot] commented on code in PR #29954:
URL: https://github.com/apache/doris/pull/29954#discussion_r1451692986


##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;
+    while (size) {
+        --uint_dst;

Review Comment:
   warning: arithmetic on a pointer to void [clang-diagnostic-error]
   ```cpp
           --uint_dst;
           ^
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_compat(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_compat(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 8) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 12) != 0);
+    }
+};
+
+class FunctionIsIPv4Mapped : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_mapped";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Mapped>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_mapped(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_mapped(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               ((unaligned_load_little_endian<UInt64>(address + 8) & 
0x00000000FFFFFFFFull) ==

Review Comment:
   warning: integer literal has suffix 'ull', which is not uppercase 
[readability-uppercase-literal-suffix]
   
   ```suggestion
                  ((unaligned_load_little_endian<UInt64>(address + 8) & 
0x00000000FFFFFFFFULL) ==
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;

Review Comment:
   warning: arithmetic on a pointer to void [clang-diagnostic-error]
   ```cpp
       uint_dst += size;
                ^
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;
+    while (size) {
+        --uint_dst;
+        *uint_dst = *uint_src;

Review Comment:
   warning: incomplete type 'void' is not assignable [clang-diagnostic-error]
   ```cpp
           *uint_dst = *uint_src;
                     ^
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@ void unaligned_store(void* address, const typename 
std::enable_if<true, T>::type
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);

Review Comment:
   warning: unknown type name 'uint8_t' [clang-diagnostic-error]
   ```cpp
       auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
                                         ^
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);

Review Comment:
   warning: unknown type name 'uint8_t' [clang-diagnostic-error]
   ```cpp
       const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
                                                     ^
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;
+    while (size) {
+        --uint_dst;
+        *uint_dst = *uint_src;

Review Comment:
   warning: ISO C++ does not allow indirection on operand of type 'void *' 
[clang-diagnostic-void-ptr-dereference]
   ```cpp
           *uint_dst = *uint_src;
           ^
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_compat(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_compat(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 8) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 12) != 0);
+    }
+};
+
+class FunctionIsIPv4Mapped : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_mapped";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Mapped>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_mapped(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_mapped(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               ((unaligned_load_little_endian<UInt64>(address + 8) & 
0x00000000FFFFFFFFull) ==
+                0x00000000FFFF0000ull);

Review Comment:
   warning: integer literal has suffix 'ull', which is not uppercase 
[readability-uppercase-literal-suffix]
   
   ```suggestion
                   0x00000000FFFF0000ULL);
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_compat(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_compat(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 8) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 12) != 0);
+    }
+};
+
+class FunctionIsIPv4Mapped : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_mapped";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Mapped>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{

Review Comment:
   warning: method 'execute_impl' can be made static 
[readability-convert-member-functions-to-static]
   
   ```suggestion
       static Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
                           size_t result, size_t input_rows_count) override {
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@ class FunctionIsIPAddressInRange : public IFunction {
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {

Review Comment:
   warning: method 'get_return_type_impl' can be made static 
[readability-convert-member-functions-to-static]
   
   ```suggestion
       static DataTypePtr get_return_type_impl(const DataTypes& arguments) 
override {
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;
+    while (size) {
+        --uint_dst;
+        *uint_dst = *uint_src;

Review Comment:
   warning: ISO C++ does not allow indirection on operand of type 'const void 
*' [clang-diagnostic-void-ptr-dereference]
   ```cpp
           *uint_dst = *uint_src;
                       ^
   ```
   



##########
be/src/vec/common/unaligned.h:
##########
@@ -40,3 +40,32 @@
     static_assert(std::is_trivially_copyable_v<T>);
     memcpy(address, &src, sizeof(src));
 }
+
+inline void reverse_memcpy(void* dst, const void* src, size_t size) {
+    auto* uint_dst = reinterpret_cast<uint8_t*>(dst);
+    const auto* uint_src = reinterpret_cast<const uint8_t*>(src);
+
+    uint_dst += size;
+    while (size) {
+        --uint_dst;
+        *uint_dst = *uint_src;
+        ++uint_src;

Review Comment:
   warning: arithmetic on a pointer to void [clang-diagnostic-error]
   ```cpp
           ++uint_src;
           ^
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{
+        const ColumnPtr& column = block.get_by_position(arguments[0]).column;
+        const auto* col_in = check_and_get_column<ColumnString>(column.get());
+
+        if (!col_in)
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "Illegal column {} of argument of function {}, 
expected String",
+                            column->get_name(), get_name());
+        size_t col_size = col_in->size();
+        auto col_res = ColumnUInt8::create(col_size, 0);
+        auto null_map = ColumnUInt8::create(col_size, 0);
+
+        for (size_t i = 0; i < col_size; ++i) {
+            auto& col_res_data = col_res->get_data();
+            auto& null_map_data = null_map->get_data();
+
+            if (col_in->is_null_at(i)) {
+                null_map_data[i] = 1;
+            } else {
+                auto ipv4_in = col_in->get_data_at(i);
+                if (is_ipv4_compat(reinterpret_cast<const 
UInt8*>(ipv4_in.data))) {
+                    col_res_data[i] = 1;
+                }
+            }
+        }
+
+        block.replace_by_position(result,
+                                  ColumnNullable::create(std::move(col_res), 
std::move(null_map)));
+        return Status::OK();
+    }
+
+private:
+    static bool is_ipv4_compat(const UInt8* address) {
+        return (unaligned_load_little_endian<UInt64>(address) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 8) == 0) &&
+               (unaligned_load_little_endian<UInt32>(address + 12) != 0);
+    }
+};
+
+class FunctionIsIPv4Mapped : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_mapped";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Mapped>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {

Review Comment:
   warning: method 'get_return_type_impl' can be made static 
[readability-convert-member-functions-to-static]
   
   ```suggestion
       static DataTypePtr get_return_type_impl(const DataTypes& arguments) 
override {
   ```
   



##########
be/src/vec/functions/function_ip.h:
##########
@@ -832,4 +793,114 @@
     }
 };
 
+class FunctionIsIPv4Compat : public IFunction {
+public:
+    static constexpr auto name = "is_ipv4_compat";
+    static FunctionPtr create() { return 
std::make_shared<FunctionIsIPv4Compat>(); }
+
+    String get_name() const override { return name; }
+
+    size_t get_number_of_arguments() const override { return 1; }
+
+    DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
+        return make_nullable(std::make_shared<DataTypeUInt8>());
+    }
+
+    bool use_default_implementation_for_nulls() const override { return true; }
+
+    Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
+                        size_t result, size_t input_rows_count) const override 
{

Review Comment:
   warning: method 'execute_impl' can be made static 
[readability-convert-member-functions-to-static]
   
   ```suggestion
       static Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
                           size_t result, size_t input_rows_count) override {
   ```
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to