This is an automated email from the ASF dual-hosted git repository.
dataroaring 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 b4aef889f2 [feature-array](array-function) add array constructor
function `array()` (#14250)
b4aef889f2 is described below
commit b4aef889f2f26f5ef43d31e1394d7623dc23ce1d
Author: lihangyu <[email protected]>
AuthorDate: Sat Nov 19 10:49:50 2022 +0800
[feature-array](array-function) add array constructor function `array()`
(#14250)
* [feature-array](array-function) add array constructor function `array()`
```
mysql> select array(qid, creationDate) from nested_c_2 limit 10;
+------------------------------+
| array(`qid`, `creationDate`) |
+------------------------------+
| [1000038, 20090616074056] |
| [1000069, 20090616075005] |
| [1000130, 20090616080918] |
| [1000145, 20090616081545] |
+------------------------------+
10 rows in set (0.01 sec)
```
---
be/src/vec/CMakeLists.txt | 1 +
.../functions/array/function_array_constructor.cpp | 90 ++++++++++++++++++++++
.../functions/array/function_array_register.cpp | 2 +
.../sql-functions/array-functions/array.md | 84 ++++++++++++++++++++
.../sql-functions/array-functions/array.md | 84 ++++++++++++++++++++
gensrc/script/doris_builtins_functions.py | 22 ++++--
.../array_functions/test_array_functions.out | 33 ++++++++
.../test_array_functions_by_literal.out | 9 +++
.../test_array_functions_with_where.out | 15 ++++
.../array_functions/test_array_functions.groovy | 3 +
.../test_array_functions_by_literal.groovy | 4 +-
.../test_array_functions_with_where.groovy | 3 +
12 files changed, 342 insertions(+), 8 deletions(-)
diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt
index b2def81de9..2c9a3b051a 100644
--- a/be/src/vec/CMakeLists.txt
+++ b/be/src/vec/CMakeLists.txt
@@ -162,6 +162,7 @@ set(VEC_FILES
functions/array/function_array_range.cpp
functions/array/function_array_compact.cpp
functions/array/function_array_popback.cpp
+ functions/array/function_array_constructor.cpp
functions/array/function_array_with_constant.cpp
exprs/table_function/vexplode_json_array.cpp
functions/math.cpp
diff --git a/be/src/vec/functions/array/function_array_constructor.cpp
b/be/src/vec/functions/array/function_array_constructor.cpp
new file mode 100644
index 0000000000..fcb71eeede
--- /dev/null
+++ b/be/src/vec/functions/array/function_array_constructor.cpp
@@ -0,0 +1,90 @@
+// 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 <string_view>
+
+#include "vec/columns/column_array.h"
+#include "vec/columns/column_string.h"
+#include "vec/common/string_ref.h"
+#include "vec/data_types/data_type_array.h"
+#include "vec/data_types/data_type_number.h"
+#include "vec/data_types/get_least_supertype.h"
+#include "vec/functions/array/function_array_utils.h"
+#include "vec/functions/function.h"
+#include "vec/functions/simple_function_factory.h"
+
+namespace doris::vectorized {
+
+// construct an array
+// array(col1, col2, '22') -> [col1, col2, '22']
+class FunctionArrayConstructor : public IFunction {
+public:
+ static constexpr auto name = "array";
+ static FunctionPtr create() { return
std::make_shared<FunctionArrayConstructor>(); }
+
+ /// Get function name.
+ String get_name() const override { return name; }
+
+ bool is_variadic() const override { return true; }
+
+ bool use_default_implementation_for_nulls() const override { return false;
}
+
+ size_t get_number_of_arguments() const override { return 1; }
+
+ DataTypePtr get_return_type_impl(const DataTypes& arguments) const
override {
+ DCHECK(arguments.size() > 0)
+ << "function: " << get_name() << ", arguments should not be
empty";
+ return
std::make_shared<DataTypeArray>(make_nullable(remove_nullable(arguments[0])));
+ }
+
+ Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
+ size_t result, size_t input_rows_count) override {
+ size_t num_element = arguments.size();
+ auto result_col = block.get_by_position(result).type->create_column();
+ auto result_array_col = static_cast<ColumnArray*>(result_col.get());
+ IColumn& result_nested_col = result_array_col->get_data();
+ ColumnArray::Offsets64& result_offset_col =
result_array_col->get_offsets();
+ result_nested_col.reserve(input_rows_count * num_element);
+ result_offset_col.resize(input_rows_count);
+
+ // convert to nullable column
+ for (size_t i = 0; i < num_element; ++i) {
+ auto& col = block.get_by_position(arguments[i]).column;
+ col = col->convert_to_full_column_if_const();
+ if (result_nested_col.is_nullable() && !col->is_nullable()) {
+ col = ColumnNullable::create(col,
ColumnUInt8::create(col->size(), 0));
+ }
+ }
+
+ // insert value into array
+ ColumnArray::Offset64 offset = 0;
+ for (size_t row = 0; row < input_rows_count; ++row) {
+ for (size_t idx = 0; idx < num_element; ++idx) {
+
result_nested_col.insert_from(*block.get_by_position(arguments[idx]).column,
row);
+ }
+ offset += num_element;
+ result_offset_col[row] = offset;
+ }
+ block.replace_by_position(result, std::move(result_col));
+ return Status::OK();
+ }
+};
+
+void register_function_array_constructor(SimpleFunctionFactory& factory) {
+ factory.register_function<FunctionArrayConstructor>();
+}
+
+} // namespace doris::vectorized
diff --git a/be/src/vec/functions/array/function_array_register.cpp
b/be/src/vec/functions/array/function_array_register.cpp
index 82d3b79131..3d13a86862 100644
--- a/be/src/vec/functions/array/function_array_register.cpp
+++ b/be/src/vec/functions/array/function_array_register.cpp
@@ -40,6 +40,7 @@ void register_function_array_range(SimpleFunctionFactory&);
void register_function_array_compact(SimpleFunctionFactory&);
void register_function_array_popback(SimpleFunctionFactory&);
void register_function_array_with_constant(SimpleFunctionFactory&);
+void register_function_array_constructor(SimpleFunctionFactory&);
void register_function_array(SimpleFunctionFactory& factory) {
register_function_array_element(factory);
@@ -60,6 +61,7 @@ void register_function_array(SimpleFunctionFactory& factory) {
register_function_array_compact(factory);
register_function_array_popback(factory);
register_function_array_with_constant(factory);
+ register_function_array_constructor(factory);
}
} // namespace doris::vectorized
diff --git a/docs/en/docs/sql-manual/sql-functions/array-functions/array.md
b/docs/en/docs/sql-manual/sql-functions/array-functions/array.md
new file mode 100644
index 0000000000..0c968395ea
--- /dev/null
+++ b/docs/en/docs/sql-manual/sql-functions/array-functions/array.md
@@ -0,0 +1,84 @@
+---
+{
+ "title": "array constructor",
+ "language": "en"
+}
+---
+
+<!--
+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.
+-->
+
+## array()
+
+### description
+
+#### Syntax
+
+```
+ARRAY<T> array(T, ...)
+```
+construct an array with variadic elements and return it, T could be column or
literal
+
+### notice
+
+`Only supported in vectorized engine`
+
+### example
+
+```
+mysql> set enable_vectorized_engine=true;
+
+mysql> select array("1", 2, 1.1);
++----------------------+
+| array('1', 2, '1.1') |
++----------------------+
+| ['1', '2', '1.1'] |
++----------------------+
+1 row in set (0.00 sec)
+
+
+mysql> select array(null, 1);
++----------------+
+| array(NULL, 1) |
++----------------+
+| [NULL, 1] |
++----------------+
+1 row in set (0.00 sec)
+
+mysql> select array(1, 2, 3);
++----------------+
+| array(1, 2, 3) |
++----------------+
+| [1, 2, 3] |
++----------------+
+1 row in set (0.00 sec)
+
+mysql> select array(qid, creationDate, null) from nested limit 4;
++------------------------------------+
+| array(`qid`, `creationDate`, NULL) |
++------------------------------------+
+| [1000038, 20090616074056, NULL] |
+| [1000069, 20090616075005, NULL] |
+| [1000130, 20090616080918, NULL] |
+| [1000145, 20090616081545, NULL] |
++------------------------------------+
+4 rows in set (0.01 sec)
+```
+
+### keywords
+
+ARRAY,ARRAY,CONSTRUCTOR
diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array.md
b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array.md
new file mode 100644
index 0000000000..5e6f9fa688
--- /dev/null
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/array-functions/array.md
@@ -0,0 +1,84 @@
+---
+{
+ "title": "array构造函数",
+ "language": "zh-CN"
+}
+---
+
+<!--
+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.
+-->
+
+## array()
+
+### description
+
+#### Syntax
+
+```
+ARRAY<T> array(T, ...)
+```
+根据参数构造并返回array, 参数可以是多列或者常量
+
+### notice
+
+`Only supported in vectorized engine`
+
+### example
+
+```
+mysql> set enable_vectorized_engine=true;
+
+mysql> select array("1", 2, 1.1);
++----------------------+
+| array('1', 2, '1.1') |
++----------------------+
+| ['1', '2', '1.1'] |
++----------------------+
+1 row in set (0.00 sec)
+
+
+mysql> select array(null, 1);
++----------------+
+| array(NULL, 1) |
++----------------+
+| [NULL, 1] |
++----------------+
+1 row in set (0.00 sec)
+
+mysql> select array(1, 2, 3);
++----------------+
+| array(1, 2, 3) |
++----------------+
+| [1, 2, 3] |
++----------------+
+1 row in set (0.00 sec)
+
+mysql> select array(qid, creationDate, null) from nested limit 4;
++------------------------------------+
+| array(`qid`, `creationDate`, NULL) |
++------------------------------------+
+| [1000038, 20090616074056, NULL] |
+| [1000069, 20090616075005, NULL] |
+| [1000130, 20090616080918, NULL] |
+| [1000145, 20090616081545, NULL] |
++------------------------------------+
+4 rows in set (0.01 sec)
+```
+
+### keywords
+
+ARRAY,ARRAY,CONSTRUCTOR
diff --git a/gensrc/script/doris_builtins_functions.py
b/gensrc/script/doris_builtins_functions.py
index d6c25c9086..5a99b2d453 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -110,13 +110,21 @@ visible_functions = [
'15FunctionContextERKNS1_11LargeIntValE', '', '', 'vec', ''],
# array functions
- [['array'], 'ARRAY', ['INT', '...'],
-
'_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_6IntValE',
'', '', '', ''],
- [['array'], 'ARRAY', ['VARCHAR', '...'],
-
'_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_9StringValE',
'', '', '', ''],
- [['array'], 'ARRAY', ['ARRAY', '...'], '', '', '', '', ''],
- [['array'], 'ARRAY', ['MAP', '...'], '', '', '', '', ''],
- [['array'], 'ARRAY', ['STRUCT', '...'], '', '', '', '', ''],
+ [['array'], 'ARRAY', ['BOOLEAN', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['TINYINT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['SMALLINT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['INT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['BIGINT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['LARGEINT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DATETIME', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DATE', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DATETIMEV2', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DATEV2', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['FLOAT', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DOUBLE', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['DECIMALV2', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['VARCHAR', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
+ [['array'], 'ARRAY', ['STRING', '...'], '', '', '', 'vec',
'ALWAYS_NOT_NULLABLE'],
[['element_at', '%element_extract%'], 'BOOLEAN', ['ARRAY_BOOLEAN',
'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
[['element_at', '%element_extract%'], 'TINYINT', ['ARRAY_TINYINT',
'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
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 881fc309d2..d7f366c0c8 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
@@ -307,6 +307,39 @@
8 [123, 123]
9 [123, 123]
+-- !select --
+1 [2, 1]
+2 [2, 2]
+3 [2, 3]
+4 [2, 4]
+5 [2, 5]
+6 [2, 6]
+7 [2, 7]
+8 [2, 8]
+9 [2, 9]
+
+-- !select --
+1 ['1', NULL, '2020-01-01']
+2 ['2', NULL, '2020-01-01']
+3 ['3', NULL, '2020-01-01']
+4 ['4', NULL, '2020-01-01']
+5 ['5', NULL, '2020-01-01']
+6 ['6', NULL, '2020-01-01']
+7 ['7', NULL, '2020-01-01']
+8 ['8', NULL, '2020-01-01']
+9 ['9', NULL, '2020-01-01']
+
+-- !select --
+1 [NULL, 1]
+2 [NULL, 2]
+3 [NULL, 3]
+4 [NULL, 4]
+5 [NULL, 5]
+6 [NULL, 6]
+7 [NULL, 7]
+8 [NULL, 8]
+9 [NULL, 9]
+
-- !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 137e978241..ef20547749 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
@@ -407,3 +407,12 @@ _
-- !sql --
['2015-03-13']
+-- !sql --
+[8, NULL]
+
+-- !sql --
+['a', '1', '2']
+
+-- !sql --
+[NULL, NULL, NULL]
+
diff --git
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_with_where.out
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_with_where.out
index 610a739472..042c5337f5 100644
---
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_with_where.out
+++
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_with_where.out
@@ -18,3 +18,18 @@
-- !select --
\N [NULL, NULL, NULL, NULL, NULL]
+-- !select --
+1 [5, 1]
+2 [5, 2]
+3 [5, 3]
+
+-- !select --
+1 ['1', 'abc']
+2 ['2', 'abc']
+3 ['3', 'abc']
+
+-- !select --
+1 [NULL, 1]
+2 [NULL, 2]
+3 [NULL, 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 cc478364e0..223997ed40 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
@@ -76,6 +76,9 @@ suite("test_array_functions") {
qt_select "SELECT k1, array_with_constant(10, null) from ${tableName}
ORDER BY k1"
qt_select "SELECT k1, array_with_constant(2, 'a') from ${tableName} ORDER
BY k1"
qt_select "SELECT k1, array_with_constant(2, 123) from ${tableName} ORDER
BY k1"
+ 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"
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 37f3f8037f..1d7ab14f9d 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
@@ -172,7 +172,6 @@ suite("test_array_functions_by_literal") {
qt_sql "select array_with_constant(2, '1')"
qt_sql "select array_with_constant(4, 1223)"
qt_sql "select array_with_constant(8, null)"
-
// array_compact function
qt_sql "select array_compact([1, 2, 3, 3, null, null, 4, 4])"
qt_sql "select array_compact([null, null, null])"
@@ -181,6 +180,9 @@ suite("test_array_functions_by_literal") {
qt_sql "select array_compact(['aaa','aaa','bbb','ccc','ccccc',null,
null,'dddd'])"
qt_sql "select array_compact(['2015-03-13','2015-03-13'])"
+ qt_sql "select array(8, null)"
+ qt_sql "select array('a', 1, 2)"
+ qt_sql "select array(null, null, null)"
// abnormal test
test {
sql "select array_intersect([1, 2, 3, 1, 2, 3], '1[3, 2, 5]')"
diff --git
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_with_where.groovy
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_with_where.groovy
index 5ad39b199f..3cf2b555e4 100644
---
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_with_where.groovy
+++
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_with_where.groovy
@@ -46,6 +46,9 @@ suite("test_array_functions_with_where") {
qt_select "SELECT k1, size(k2) FROM ${tableName} WHERE arrays_overlap(k2,
k4) ORDER BY k1"
qt_select "SELECT k1, size(k2) FROM ${tableName} WHERE cardinality(k2)>0
ORDER BY k1, size(k2)"
qt_select "SELECT k1, array_with_constant(5, k1) FROM ${tableName} WHERE
k1 is null ORDER BY k1, size(k2)"
+ qt_select "SELECT k1, array(5, k1) FROM ${tableName} WHERE k1 is not null
ORDER BY k1, size(k2)"
+ qt_select "SELECT k1, array(k1, 'abc') FROM ${tableName} WHERE k1 is not
null ORDER BY k1, size(k2)"
+ qt_select "SELECT k1, array(null, k1) FROM ${tableName} WHERE k1 is not
null ORDER BY k1, size(k2)"
test {
sql "select k1, size(k2) FROM ${tableName} WHERE k2 = []"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]