This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 9b712b03b402e7d4ab06b91b33f1c3840283f696
Author: yangshijie <sjyang2...@zju.edu.cn>
AuthorDate: Tue May 7 15:03:58 2024 +0800

    [FIX]fix is_ip_address_in_range func with const param (#34266)
---
 be/src/vec/functions/function_ip.h                 | 18 +++--
 be/test/vec/function/function_ip_test.cpp          | 83 ++++++++++++++++++++++
 .../test_is_ip_address_in_range_function.out       | 56 +++++++++++++++
 .../test_is_ip_address_in_range_function.groovy    | 24 +++++++
 4 files changed, 175 insertions(+), 6 deletions(-)

diff --git a/be/src/vec/functions/function_ip.h 
b/be/src/vec/functions/function_ip.h
index 9f70d4b3afa..a78f6cd1df1 100644
--- a/be/src/vec/functions/function_ip.h
+++ b/be/src/vec/functions/function_ip.h
@@ -672,8 +672,10 @@ public:
         const auto& cidr_column_with_type_and_name = 
block.get_by_position(arguments[1]);
         WhichDataType addr_type(addr_column_with_type_and_name.type);
         WhichDataType cidr_type(cidr_column_with_type_and_name.type);
-        const ColumnPtr& addr_column = addr_column_with_type_and_name.column;
-        const ColumnPtr& cidr_column = cidr_column_with_type_and_name.column;
+        const auto& [addr_column, addr_const] =
+                unpack_if_const(addr_column_with_type_and_name.column);
+        const auto& [cidr_column, cidr_const] =
+                unpack_if_const(cidr_column_with_type_and_name.column);
         const ColumnString* str_addr_column = nullptr;
         const ColumnString* str_cidr_column = nullptr;
         const NullMap* null_map_addr = nullptr;
@@ -715,18 +717,22 @@ public:
         auto& col_res_data = col_res->get_data();
 
         for (size_t i = 0; i < input_rows_count; ++i) {
-            if (null_map_addr && (*null_map_addr)[i]) {
+            auto addr_idx = index_check_const(i, addr_const);
+            auto cidr_idx = index_check_const(i, cidr_const);
+            if (null_map_addr && (*null_map_addr)[addr_idx]) {
                 throw Exception(ErrorCode::INVALID_ARGUMENT,
                                 "The arguments of function {} must be String, 
not NULL",
                                 get_name());
             }
-            if (null_map_cidr && (*null_map_cidr)[i]) {
+            if (null_map_cidr && (*null_map_cidr)[cidr_idx]) {
                 throw Exception(ErrorCode::INVALID_ARGUMENT,
                                 "The arguments of function {} must be String, 
not NULL",
                                 get_name());
             }
-            const auto addr = 
IPAddressVariant(str_addr_column->get_data_at(i).to_string_view());
-            const auto cidr = 
parse_ip_with_cidr(str_cidr_column->get_data_at(i).to_string_view());
+            const auto addr =
+                    
IPAddressVariant(str_addr_column->get_data_at(addr_idx).to_string_view());
+            const auto cidr =
+                    
parse_ip_with_cidr(str_cidr_column->get_data_at(cidr_idx).to_string_view());
             col_res_data[i] = is_address_in_range(addr, cidr) ? 1 : 0;
         }
 
diff --git a/be/test/vec/function/function_ip_test.cpp 
b/be/test/vec/function/function_ip_test.cpp
new file mode 100644
index 00000000000..70cd82655b4
--- /dev/null
+++ b/be/test/vec/function/function_ip_test.cpp
@@ -0,0 +1,83 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "function_test_util.h"
+#include "gtest/gtest_pred_impl.h"
+#include "vec/core/types.h"
+#include "vec/data_types/data_type_number.h"
+
+namespace doris::vectorized {
+
+TEST(FunctionIpTest, FunctionIsIPAddressInRangeTest) {
+    std::string func_name = "is_ip_address_in_range";
+
+    DataSet data_set = {
+            {{std::string("127.0.0.1"), std::string("127.0.0.0/8")}, 
(uint8_t)1},
+            {{std::string("128.0.0.1"), std::string("127.0.0.0/8")}, 
(uint8_t)0},
+            {{std::string("ffff::1"), std::string("ffff::/16")}, (uint8_t)1},
+            {{std::string("fffe::1"), std::string("ffff::/16")}, (uint8_t)0},
+            {{std::string("192.168.99.255"), std::string("192.168.100.0/22")}, 
(uint8_t)0},
+            {{std::string("192.168.100.1"), std::string("192.168.100.0/22")}, 
(uint8_t)1},
+            {{std::string("192.168.103.255"), 
std::string("192.168.100.0/22")}, (uint8_t)1},
+            {{std::string("192.168.104.0"), std::string("192.168.100.0/22")}, 
(uint8_t)0},
+            {{std::string("::192.168.99.255"), 
std::string("::192.168.100.0/118")}, (uint8_t)0},
+            {{std::string("::192.168.100.1"), 
std::string("::192.168.100.0/118")}, (uint8_t)1},
+            {{std::string("::192.168.103.255"), 
std::string("::192.168.100.0/118")}, (uint8_t)1},
+            {{std::string("::192.168.104.0"), 
std::string("::192.168.100.0/118")}, (uint8_t)0},
+            {{std::string("192.168.100.1"), std::string("192.168.100.0/22")}, 
(uint8_t)1},
+            {{std::string("192.168.100.1"), std::string("192.168.100.0/24")}, 
(uint8_t)1},
+            {{std::string("192.168.100.1"), std::string("192.168.100.0/32")}, 
(uint8_t)0},
+            {{std::string("::192.168.100.1"), 
std::string("::192.168.100.0/118")}, (uint8_t)1},
+            {{std::string("::192.168.100.1"), 
std::string("::192.168.100.0/120")}, (uint8_t)1},
+            {{std::string("::192.168.100.1"), 
std::string("::192.168.100.0/128")}, (uint8_t)0},
+            {{std::string("192.168.100.1"), std::string("192.168.100.0/22")}, 
(uint8_t)1},
+            {{std::string("192.168.103.255"), 
std::string("192.168.100.0/24")}, (uint8_t)0},
+            {{std::string("::192.168.100.1"), 
std::string("::192.168.100.0/118")}, (uint8_t)1},
+            {{std::string("::192.168.103.255"), 
std::string("::192.168.100.0/120")}, (uint8_t)0},
+            {{std::string("127.0.0.1"), std::string("ffff::/16")}, (uint8_t)0},
+            {{std::string("127.0.0.1"), std::string("::127.0.0.1/128")}, 
(uint8_t)0},
+            {{std::string("::1"), std::string("127.0.0.0/8")}, (uint8_t)0},
+            {{std::string("::127.0.0.1"), std::string("127.0.0.1/32")}, 
(uint8_t)0}};
+
+    {
+        // vector vs vector
+        InputTypeSet input_types = {TypeIndex::String, TypeIndex::String};
+        static_cast<void>(check_function<DataTypeUInt8, false>(func_name, 
input_types, data_set));
+    }
+
+    {
+        // vector vs scalar
+        InputTypeSet input_types = {TypeIndex::String, Consted 
{TypeIndex::String}};
+        for (const auto& line : data_set) {
+            DataSet const_cidr_dataset = {line};
+            static_cast<void>(check_function<DataTypeUInt8, false>(func_name, 
input_types,
+                                                                   
const_cidr_dataset));
+        }
+    }
+
+    {
+        // scalar vs vector
+        InputTypeSet input_types = {Consted {TypeIndex::String}, 
TypeIndex::String};
+        for (const auto& line : data_set) {
+            DataSet const_addr_dataset = {line};
+            static_cast<void>(check_function<DataTypeUInt8, false>(func_name, 
input_types,
+                                                                   
const_addr_dataset));
+        }
+    }
+}
+
+} // namespace doris::vectorized
diff --git 
a/regression-test/data/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.out
 
b/regression-test/data/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.out
index c21ca672a38..391ee192b58 100644
--- 
a/regression-test/data/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.out
+++ 
b/regression-test/data/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.out
@@ -25,3 +25,59 @@
 24     false
 25     false
 26     false
+
+-- !sql --
+1      false
+2      false
+3      false
+4      false
+5      false
+6      true
+7      false
+8      false
+9      false
+10     false
+11     false
+12     false
+13     true
+14     true
+15     true
+16     false
+17     false
+18     false
+19     true
+20     false
+21     false
+22     false
+23     false
+24     false
+25     false
+26     false
+
+-- !sql --
+1      false
+2      false
+3      false
+4      false
+5      true
+6      true
+7      true
+8      true
+9      false
+10     false
+11     false
+12     false
+13     true
+14     true
+15     true
+16     false
+17     false
+18     false
+19     true
+20     true
+21     false
+22     false
+23     false
+24     false
+25     false
+26     false
\ No newline at end of file
diff --git 
a/regression-test/suites/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.groovy
 
b/regression-test/suites/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.groovy
index 685ca9154de..e7b496a1408 100644
--- 
a/regression-test/suites/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/ip_functions/test_is_ip_address_in_range_function.groovy
@@ -64,7 +64,31 @@ suite("test_is_ip_address_in_range_function") {
         (26, '::127.0.0.1', '127.0.0.1/32')
         """
 
+    // vector vs vector
     qt_sql "select id, is_ip_address_in_range(addr, cidr) from 
test_is_ip_address_in_range_function order by id"
 
+    // vector vs scalar
+    qt_sql "select id, is_ip_address_in_range(addr, '192.168.100.0/24') from 
test_is_ip_address_in_range_function order by id"
+
+    // scalar vs vector
+    qt_sql "select id, is_ip_address_in_range('192.168.100.0', cidr) from 
test_is_ip_address_in_range_function order by id"
+
+    test {
+        sql "SELECT is_ip_address_in_range('::ffff:192.168.0.1', NULL)"
+        // check exception message contains
+        exception "The arguments of function is_ip_address_in_range must be 
String, not NULL"
+    }
+
+    test {
+        sql "SELECT is_ip_address_in_range(NULL, '::ffff:192.168.0.4/128')"
+        // check exception message contains
+        exception "The arguments of function is_ip_address_in_range must be 
String, not NULL"
+    }
+
+    test {
+        sql "SELECT is_ip_address_in_range(NULL, NULL)"
+        // check exception message contains
+        exception "The arguments of function is_ip_address_in_range must be 
String, not NULL"
+    }
     sql """ DROP TABLE IF EXISTS test_is_ip_address_in_range_function """
 }
\ No newline at end of file


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

Reply via email to