This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 7ba4cd764a [enhancement](array-function) `array_position`,`array_contains`,`countequal` which in `FunctionArrayIndex` handle target NULL (#14564) 7ba4cd764a is described below commit 7ba4cd764acac3a03a426fccae2e27d3fa226ccb Author: lihangyu <15605149...@163.com> AuthorDate: Fri Nov 25 14:19:50 2022 +0800 [enhancement](array-function) `array_position`,`array_contains`,`countequal` which in `FunctionArrayIndex` handle target NULL (#14564) in the previous, the result is: ``` mysql> select array_position([1, null], null); +--------------------------------------+ | array_position(ARRAY(1, NULL), NULL) | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set (0.02 sec) ``` but after this commit, the result become: ``` mysql> select array_position([1, null], null); +--------------------------------------+ | array_position(ARRAY(1, NULL), NULL) | +--------------------------------------+ | 2 | +--------------------------------------+ 1 row in set (0.02 sec) ``` --- be/src/vec/functions/array/function_array_index.h | 189 +++++++++++++++------ .../array-functions/array_contains.md | 8 + .../array-functions/array_position.md | 10 +- .../array-functions/array_contains.md | 8 + .../array-functions/array_position.md | 10 +- gensrc/script/doris_builtins_functions.py | 92 +++++----- .../array_functions/test_array_functions.out | 127 +++++++++++++- .../test_array_functions_by_literal.out | 20 ++- .../array_functions/test_array_functions.groovy | 11 ++ .../test_array_functions_by_literal.groovy | 4 + 10 files changed, 368 insertions(+), 111 deletions(-) diff --git a/be/src/vec/functions/array/function_array_index.h b/be/src/vec/functions/array/function_array_index.h index be39c4dcb5..bce8eb2caf 100644 --- a/be/src/vec/functions/array/function_array_index.h +++ b/be/src/vec/functions/array/function_array_index.h @@ -62,9 +62,11 @@ public: size_t get_number_of_arguments() const override { return 2; } + bool use_default_implementation_for_nulls() const override { return false; } + DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { - DCHECK(is_array(arguments[0])); - return std::make_shared<DataTypeNumber<ResultType>>(); + // DCHECK(is_array(arguments[0])); + return make_nullable(std::make_shared<DataTypeNumber<ResultType>>()); } Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, @@ -74,7 +76,8 @@ public: private: ColumnPtr _execute_string(const ColumnArray::Offsets64& offsets, const UInt8* nested_null_map, - const IColumn& nested_column, const IColumn& right_column) { + const IColumn& nested_column, const IColumn& right_column, + const UInt8* right_nested_null_map, const UInt8* outer_null_map) { // check array nested column type and get data const auto& str_offs = reinterpret_cast<const ColumnString&>(nested_column).get_offsets(); const auto& str_chars = reinterpret_cast<const ColumnString&>(nested_column).get_chars(); @@ -86,9 +89,16 @@ private: // prepare return data auto dst = ColumnVector<ResultType>::create(offsets.size()); auto& dst_data = dst->get_data(); + auto dst_null_column = ColumnUInt8::create(offsets.size()); + auto& dst_null_data = dst_null_column->get_data(); // process for (size_t row = 0; row < offsets.size(); ++row) { + if (outer_null_map && outer_null_map[row]) { + dst_null_data[row] = true; + continue; + } + dst_null_data[row] = false; ResultType res = 0; size_t off = offsets[row - 1]; size_t len = offsets[row] - off; @@ -96,10 +106,20 @@ private: size_t right_off = right_offs[row - 1]; size_t right_len = right_offs[row] - right_off; for (size_t pos = 0; pos < len; ++pos) { + // match null value + if (right_nested_null_map && right_nested_null_map[row] && nested_null_map && + nested_null_map[pos + off]) { + ConcreteAction::apply(res, pos); + break; + } + // some is null while another is not + if (right_nested_null_map && nested_null_map && + right_nested_null_map[row] != nested_null_map[pos + off]) { + continue; + } if (nested_null_map && nested_null_map[pos + off]) { continue; } - size_t str_pos = str_offs[pos + off - 1]; size_t str_len = str_offs[pos + off] - str_pos; const char* left_raw_v = reinterpret_cast<const char*>(&str_chars[str_pos]); @@ -112,12 +132,13 @@ private: } dst_data[row] = res; } - return dst; + return ColumnNullable::create(std::move(dst), std::move(dst_null_column)); } template <typename NestedColumnType, typename RightColumnType> ColumnPtr _execute_number(const ColumnArray::Offsets64& offsets, const UInt8* nested_null_map, - const IColumn& nested_column, const IColumn& right_column) { + const IColumn& nested_column, const IColumn& right_column, + const UInt8* right_nested_null_map, const UInt8* outer_null_map) { // check array nested column type and get data const auto& nested_data = reinterpret_cast<const NestedColumnType&>(nested_column).get_data(); @@ -128,17 +149,34 @@ private: // prepare return data auto dst = ColumnVector<ResultType>::create(offsets.size()); auto& dst_data = dst->get_data(); + auto dst_null_column = ColumnUInt8::create(offsets.size()); + auto& dst_null_data = dst_null_column->get_data(); // process for (size_t row = 0; row < offsets.size(); ++row) { + if (outer_null_map && outer_null_map[row]) { + dst_null_data[row] = true; + continue; + } + dst_null_data[row] = false; ResultType res = 0; size_t off = offsets[row - 1]; size_t len = offsets[row] - off; for (size_t pos = 0; pos < len; ++pos) { + // match null value + if (right_nested_null_map && right_nested_null_map[row] && nested_null_map && + nested_null_map[pos + off]) { + ConcreteAction::apply(res, pos); + break; + } + // some is null while another is not + if (right_nested_null_map && nested_null_map && + right_nested_null_map[row] != nested_null_map[pos + off]) { + continue; + } if (nested_null_map && nested_null_map[pos + off]) { continue; } - if (nested_data[pos + off] == right_data[row]) { ConcreteAction::apply(res, pos); break; @@ -146,46 +184,59 @@ private: } dst_data[row] = res; } - return dst; + return ColumnNullable::create(std::move(dst), std::move(dst_null_column)); } template <typename NestedColumnType> ColumnPtr _execute_number_expanded(const ColumnArray::Offsets64& offsets, const UInt8* nested_null_map, const IColumn& nested_column, - const IColumn& right_column) { + const IColumn& right_column, + const UInt8* right_nested_null_map, + const UInt8* outer_null_map) { if (check_column<ColumnUInt8>(right_column)) { - return _execute_number<NestedColumnType, ColumnUInt8>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnUInt8>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnInt8>(right_column)) { - return _execute_number<NestedColumnType, ColumnInt8>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnInt8>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnInt16>(right_column)) { - return _execute_number<NestedColumnType, ColumnInt16>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnInt16>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnInt32>(right_column)) { - return _execute_number<NestedColumnType, ColumnInt32>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnInt32>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnInt64>(right_column)) { - return _execute_number<NestedColumnType, ColumnInt64>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnInt64>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnInt128>(right_column)) { - return _execute_number<NestedColumnType, ColumnInt128>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnInt128>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnFloat32>(right_column)) { - return _execute_number<NestedColumnType, ColumnFloat32>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnFloat32>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnFloat64>(right_column)) { - return _execute_number<NestedColumnType, ColumnFloat64>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnFloat64>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (right_column.is_date_type()) { - return _execute_number<NestedColumnType, ColumnDate>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnDate>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (right_column.is_datetime_type()) { - return _execute_number<NestedColumnType, ColumnDateTime>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnDateTime>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } else if (check_column<ColumnDecimal128>(right_column)) { - return _execute_number<NestedColumnType, ColumnDecimal128>(offsets, nested_null_map, - nested_column, right_column); + return _execute_number<NestedColumnType, ColumnDecimal128>( + offsets, nested_null_map, nested_column, right_column, right_nested_null_map, + outer_null_map); } return nullptr; } @@ -195,71 +246,97 @@ private: // extract array offsets and nested data auto left_column = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const(); - const auto& array_column = reinterpret_cast<const ColumnArray&>(*left_column); - const auto& offsets = array_column.get_offsets(); + const ColumnArray* array_column = nullptr; + const UInt8* array_null_map = nullptr; + if (left_column->is_nullable()) { + auto nullable_array = reinterpret_cast<const ColumnNullable*>(left_column.get()); + array_column = + reinterpret_cast<const ColumnArray*>(&nullable_array->get_nested_column()); + array_null_map = nullable_array->get_null_map_column().get_data().data(); + } else { + array_column = reinterpret_cast<const ColumnArray*>(left_column.get()); + } + const auto& offsets = array_column->get_offsets(); const UInt8* nested_null_map = nullptr; ColumnPtr nested_column = nullptr; - if (array_column.get_data().is_nullable()) { + if (array_column->get_data().is_nullable()) { const auto& nested_null_column = - reinterpret_cast<const ColumnNullable&>(array_column.get_data()); + reinterpret_cast<const ColumnNullable&>(array_column->get_data()); nested_null_map = nested_null_column.get_null_map_column().get_data().data(); nested_column = nested_null_column.get_nested_column_ptr(); } else { - nested_column = array_column.get_data_ptr(); + nested_column = array_column->get_data_ptr(); } // get right column - auto right_column = + ColumnPtr right_full_column = block.get_by_position(arguments[1]).column->convert_to_full_column_if_const(); - + ColumnPtr right_column = right_full_column; + const UInt8* right_nested_null_map = nullptr; + if (right_column->is_nullable()) { + const auto& nested_null_column = assert_cast<const ColumnNullable&>(*right_full_column); + right_column = nested_null_column.get_nested_column_ptr(); + right_nested_null_map = nested_null_column.get_null_map_column().get_data().data(); + } // execute - auto left_element_type = remove_nullable( - assert_cast<const DataTypeArray&>(*block.get_by_position(arguments[0]).type) - .get_nested_type()); + auto array_type = remove_nullable(block.get_by_position(arguments[0]).type); + auto left_element_type = + remove_nullable(assert_cast<const DataTypeArray&>(*array_type).get_nested_type()); auto right_type = remove_nullable(block.get_by_position(arguments[1]).type); ColumnPtr return_column = nullptr; if (is_string(right_type) && is_string(left_element_type)) { - return_column = - _execute_string(offsets, nested_null_map, *nested_column, *right_column); + return_column = _execute_string(offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (is_number(right_type) && is_number(left_element_type)) { if (check_column<ColumnUInt8>(*nested_column)) { return_column = _execute_number_expanded<ColumnUInt8>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnInt8>(*nested_column)) { - return_column = _execute_number_expanded<ColumnInt8>(offsets, nested_null_map, - *nested_column, *right_column); + return_column = _execute_number_expanded<ColumnInt8>( + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnInt16>(*nested_column)) { return_column = _execute_number_expanded<ColumnInt16>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnInt32>(*nested_column)) { return_column = _execute_number_expanded<ColumnInt32>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnInt64>(*nested_column)) { return_column = _execute_number_expanded<ColumnInt64>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnInt128>(*nested_column)) { return_column = _execute_number_expanded<ColumnInt128>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnFloat32>(*nested_column)) { return_column = _execute_number_expanded<ColumnFloat32>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnFloat64>(*nested_column)) { return_column = _execute_number_expanded<ColumnFloat64>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (check_column<ColumnDecimal128>(*nested_column)) { return_column = _execute_number_expanded<ColumnDecimal128>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } } else if ((is_date_or_datetime(right_type) || is_date_v2_or_datetime_v2(right_type)) && (is_date_or_datetime(left_element_type) || is_date_v2_or_datetime_v2(left_element_type))) { if (nested_column->is_date_type()) { - return_column = _execute_number_expanded<ColumnDate>(offsets, nested_null_map, - *nested_column, *right_column); + return_column = _execute_number_expanded<ColumnDate>( + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } else if (nested_column->is_datetime_type()) { return_column = _execute_number_expanded<ColumnDateTime>( - offsets, nested_null_map, *nested_column, *right_column); + offsets, nested_null_map, *nested_column, *right_column, + right_nested_null_map, array_null_map); } } diff --git a/docs/en/docs/sql-manual/sql-functions/array-functions/array_contains.md b/docs/en/docs/sql-manual/sql-functions/array-functions/array_contains.md index 501bbbb26f..1a17c560c9 100644 --- a/docs/en/docs/sql-manual/sql-functions/array-functions/array_contains.md +++ b/docs/en/docs/sql-manual/sql-functions/array-functions/array_contains.md @@ -58,6 +58,14 @@ mysql> SELECT id,c_array,array_contains(c_array, 5) FROM `array_test`; | 3 | [] | 0 | | 4 | NULL | NULL | +------+-----------------+------------------------------+ + +mysql> select array_contains([null, 1], null); ++--------------------------------------+ +| array_contains(ARRAY(NULL, 1), NULL) | ++--------------------------------------+ +| 1 | ++--------------------------------------+ +1 row in set (0.00 sec) ``` ### keywords diff --git a/docs/en/docs/sql-manual/sql-functions/array-functions/array_position.md b/docs/en/docs/sql-manual/sql-functions/array-functions/array_position.md index c7337032fc..8784ce2d2e 100644 --- a/docs/en/docs/sql-manual/sql-functions/array-functions/array_position.md +++ b/docs/en/docs/sql-manual/sql-functions/array-functions/array_position.md @@ -37,7 +37,7 @@ Returns a position/index of first occurrence of the `value` in the given array. ``` position - value position in array (starts with 1); 0 - if value does not present in the array; -NULL - when array is NULL or value is NULL. +NULL - when array is NULL. ``` ### notice @@ -58,6 +58,14 @@ mysql> SELECT id,c_array,array_position(c_array, 5) FROM `array_test`; | 3 | [] | 0 | | 4 | NULL | NULL | +------+-----------------+------------------------------+ + +mysql> select array_position([1, null], null); ++--------------------------------------+ +| array_position(ARRAY(1, NULL), NULL) | ++--------------------------------------+ +| 2 | ++--------------------------------------+ +1 row in set (0.01 sec) ``` ### keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_contains.md b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_contains.md index c5e82714af..4f5ac0ef0e 100644 --- a/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_contains.md +++ b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_contains.md @@ -58,6 +58,14 @@ mysql> SELECT id,c_array,array_contains(c_array, 5) FROM `array_test`; | 3 | [] | 0 | | 4 | NULL | NULL | +------+-----------------+------------------------------+ + +mysql> select array_contains([null, 1], null); ++--------------------------------------+ +| array_contains(ARRAY(NULL, 1), NULL) | ++--------------------------------------+ +| 1 | ++--------------------------------------+ +1 row in set (0.00 sec) ``` ### keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_position.md b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_position.md index 037b0b7d51..d7536a55be 100644 --- a/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_position.md +++ b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array_position.md @@ -37,7 +37,7 @@ under the License. ``` position - value在array中的位置(从1开始计算); 0 - 如果value在array中不存在; -NULL - 如果数组为NULL,或者value为NULL。 +NULL - 如果数组为NULL。 ``` ### notice @@ -58,6 +58,14 @@ mysql> SELECT id,c_array,array_position(c_array, 5) FROM `array_test`; | 3 | [] | 0 | | 4 | NULL | NULL | +------+-----------------+------------------------------+ + +mysql> select array_position([1, null], null); ++--------------------------------------+ +| array_position(ARRAY(1, NULL), NULL) | ++--------------------------------------+ +| 2 | ++--------------------------------------+ +1 row in set (0.01 sec) ``` ### keywords diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 4109125494..25be32c7ee 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -158,21 +158,21 @@ visible_functions = [ [['arrays_overlap'], 'BOOLEAN', ['ARRAY_VARCHAR', 'ARRAY_VARCHAR'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['arrays_overlap'], 'BOOLEAN', ['ARRAY_STRING', 'ARRAY_STRING'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], - [['array_contains'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_INT', 'INT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', ''], - [['array_contains'], 'BOOLEAN', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', ''], + [['array_contains'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_INT', 'INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_contains'], 'BOOLEAN', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_BOOLEAN'], '', '', '', 'vec', ''], @@ -191,37 +191,37 @@ visible_functions = [ [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_VARCHAR'], '', '', '', 'vec', ''], [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_STRING'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_INT', 'INT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', ''], - [['countequal'], 'BIGINT', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', ''], - - [['array_position'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_INT', 'INT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', ''], - [['array_position'], 'BIGINT', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', ''], + [['countequal'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_INT', 'INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['countequal'], 'BIGINT', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + + [['array_position'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_INT', 'INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DATE', 'DATE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], + [['array_position'], 'BIGINT', ['ARRAY_STRING', 'STRING'], '', '', '', 'vec', 'ALWAYS_NULLABLE'], [['cardinality', 'size'], 'BIGINT', ['ARRAY'], '', '', '', 'vec', ''], [['array_distinct'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN'], '', '', '', 'vec', ''], diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out index 6a7dd18f8d..e0bb00b0e0 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out @@ -142,6 +142,50 @@ 8 1_2_3_3_4_4_null a-b-b-b 9 1_2_3 a-b- +-- !select -- +1 true +2 false +3 false +4 true +5 false +6 true +7 false +8 true +9 true + +-- !select -- +1 true +2 \N +3 false +4 false +5 true +6 true +7 false +8 true +9 true + +-- !select -- +1 false +2 \N +3 false +4 false +5 false +6 false +7 true +8 false +9 false + +-- !select -- +1 false +2 false +3 \N +4 false +5 \N +6 \N +7 \N +8 false +9 false + -- !select -- 1 true 2 false @@ -165,15 +209,15 @@ 9 false -- !select -- -1 \N +1 false 2 \N 3 \N 4 \N 5 \N 6 \N 7 \N -8 \N -9 \N +8 false +9 false -- !select -- 1 [1, 2, 3] @@ -340,6 +384,83 @@ 8 [NULL, 8] 9 [NULL, 9] +-- !select -- +1 0 +2 0 +3 0 +4 5 +5 0 +6 5 +7 0 +8 0 +9 0 + +-- !select -- +1 1 +2 \N +3 0 +4 0 +5 1 +6 1 +7 0 +8 1 +9 1 + +-- !select -- +1 0 +2 \N +3 0 +4 0 +5 0 +6 0 +7 2 +8 0 +9 0 + +-- !select -- +1 0 +2 0 +3 \N +4 0 +5 \N +6 \N +7 \N +8 0 +9 0 + +-- !select -- +1 1 +2 0 +3 0 +4 \N +5 \N +6 \N +7 \N +8 1 +9 1 + +-- !select -- +1 0 +2 0 +3 0 +4 \N +5 \N +6 \N +7 \N +8 0 +9 0 + +-- !select -- +1 0 +2 \N +3 \N +4 \N +5 \N +6 \N +7 \N +8 0 +9 0 + -- !select -- \N \N -1 \N diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out index 672e4cf2d2..01ec14bfdf 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out @@ -9,13 +9,13 @@ false true -- !sql -- -\N +true -- !sql -- false -- !sql -- -\N +false -- !sql -- \N @@ -39,13 +39,13 @@ false 2 -- !sql -- -\N +1 -- !sql -- 0 -- !sql -- -\N +0 -- !sql -- \N @@ -53,6 +53,18 @@ false -- !sql -- \N +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + -- !sql -- 3 diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy index 07ea61f759..1514692651 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy @@ -61,6 +61,10 @@ suite("test_array_functions") { qt_select "SELECT k1, array_slice(k2, 1, 2) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, reverse(k2), reverse(k3), reverse(k4) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_join(k2, '_', 'null'), array_join(k3, '-', 'null') FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k2, 1) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k3, 'a') FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k3, null) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_contains(k4, null) FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k5, 'hi') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k5, 'hi222') FROM ${tableName} ORDER BY k1" qt_select "SELECT k1, array_contains(k6, null) from ${tableName} ORDER BY k1" @@ -79,6 +83,13 @@ suite("test_array_functions") { qt_select "SELECT k1, array(2, k1) from ${tableName} ORDER BY k1" qt_select "SELECT k1, array(k1, null, '2020-01-01') from ${tableName} ORDER BY k1" qt_select "SELECT k1, array(null, k1) from ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k2, 5) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k3, 'a') FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k3, null) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k4, null) FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k5, 'hi') FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k5, 'hi222') FROM ${tableName} ORDER BY k1" + qt_select "SELECT k1, array_position(k6, null) from ${tableName} ORDER BY k1" def tableName2 = "tbl_test_array_range" sql """DROP TABLE IF EXISTS ${tableName2}""" diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy index bcf0edbeb1..29b4d3690c 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy @@ -39,6 +39,10 @@ suite("test_array_functions_by_literal") { qt_sql "select array_position([], NULL)" qt_sql "select array_position(NULL, 1)" qt_sql "select array_position(NULL, NULL)" + qt_sql "select array_position([null], 0)" + qt_sql "select array_position([0], null)" + qt_sql "select array_position([null, '1'], '')" + qt_sql "select array_position([''], null)" qt_sql "select array_position([false, NULL, true], true)" // element_at function --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org