This is an automated email from the ASF dual-hosted git repository.
lihaopeng pushed a commit to branch vectorized
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/vectorized by this push:
new 881b15d [Vectorized][Feature] upport function conv (#7693)
881b15d is described below
commit 881b15df9254ffd09d86acfad93320ce0f70dd28
Author: Pxl <[email protected]>
AuthorDate: Wed Jan 12 17:08:09 2022 +0800
[Vectorized][Feature] upport function conv (#7693)
* support function conv()
* add document
---
be/src/exprs/math_functions.h | 14 +-
be/src/vec/CMakeLists.txt | 1 +
be/src/vec/data_types/data_type_bitmap.h | 2 +
be/src/vec/data_types/data_type_date.h | 2 +-
be/src/vec/data_types/data_type_date_time.h | 40 ++---
be/src/vec/data_types/data_type_decimal.h | 2 +-
be/src/vec/data_types/data_type_number_base.h | 5 +-
be/src/vec/data_types/data_type_string.h | 5 +-
be/src/vec/functions/function_conv.cpp | 163 +++++++++++++++++++++
be/src/vec/functions/simple_function_factory.h | 2 +
docs/.vuepress/sidebar/en.js | 5 +
docs/.vuepress/sidebar/zh-CN.js | 5 +
.../sql-functions/math-functions/conv.md | 60 ++++++++
.../sql-functions/math-functions/conv.md | 60 ++++++++
gensrc/script/doris_builtins_functions.py | 6 +-
15 files changed, 339 insertions(+), 33 deletions(-)
diff --git a/be/src/exprs/math_functions.h b/be/src/exprs/math_functions.h
index 15d8749..9d55ed6 100644
--- a/be/src/exprs/math_functions.h
+++ b/be/src/exprs/math_functions.h
@@ -50,7 +50,8 @@ public:
static doris_udf::IntVal abs(doris_udf::FunctionContext*, const
doris_udf::SmallIntVal&);
static doris_udf::SmallIntVal abs(doris_udf::FunctionContext*, const
doris_udf::TinyIntVal&);
- static doris_udf::TinyIntVal sign(doris_udf::FunctionContext* ctx, const
doris_udf::DoubleVal& v);
+ static doris_udf::TinyIntVal sign(doris_udf::FunctionContext* ctx,
+ const doris_udf::DoubleVal& v);
static doris_udf::DoubleVal sin(doris_udf::FunctionContext*, const
doris_udf::DoubleVal&);
static doris_udf::DoubleVal asin(doris_udf::FunctionContext*, const
doris_udf::DoubleVal&);
@@ -182,11 +183,6 @@ public:
static double my_double_round(double value, int64_t dec, bool
dec_unsigned, bool truncate);
-private:
- static const int32_t MIN_BASE = 2;
- static const int32_t MAX_BASE = 36;
- static const char* _s_alphanumeric_chars;
-
// Converts src_num in decimal to dest_base,
// and fills expr_val.string_val with the result.
static doris_udf::StringVal decimal_to_base(doris_udf::FunctionContext*
ctx, int64_t src_num,
@@ -207,6 +203,12 @@ private:
// Returns false otherwise, indicating some other error condition.
static bool handle_parse_result(int8_t dest_base, int64_t* num,
StringParser::ParseResult parse_res);
+
+ static const int32_t MIN_BASE = 2;
+ static const int32_t MAX_BASE = 36;
+
+private:
+ static const char* _s_alphanumeric_chars;
};
} // namespace doris
diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt
index 01c69eb..aa302ce 100644
--- a/be/src/vec/CMakeLists.txt
+++ b/be/src/vec/CMakeLists.txt
@@ -108,6 +108,7 @@ set(VEC_FILES
functions/functions_logical.cpp
functions/function_case.cpp
functions/function_cast.cpp
+ functions/function_conv.cpp
functions/function_string.cpp
functions/function_timestamp.cpp
functions/function_utility.cpp
diff --git a/be/src/vec/data_types/data_type_bitmap.h
b/be/src/vec/data_types/data_type_bitmap.h
index 692d6fc..69f5540 100644
--- a/be/src/vec/data_types/data_type_bitmap.h
+++ b/be/src/vec/data_types/data_type_bitmap.h
@@ -18,6 +18,7 @@
#pragma once
#include "util/bitmap_value.h"
#include "vec/columns/column.h"
+#include "vec/columns/column_complex.h"
#include "vec/core/types.h"
#include "vec/data_types/data_type.h"
@@ -27,6 +28,7 @@ public:
DataTypeBitMap() = default;
~DataTypeBitMap() override = default;
+ using ColumnType = ColumnBitmap;
using FieldType = BitmapValue;
std::string do_get_name() const override { return get_family_name(); }
diff --git a/be/src/vec/data_types/data_type_date.h
b/be/src/vec/data_types/data_type_date.h
index b3aa90c..b5d148b 100644
--- a/be/src/vec/data_types/data_type_date.h
+++ b/be/src/vec/data_types/data_type_date.h
@@ -34,7 +34,7 @@ public:
bool equals(const IDataType& rhs) const override;
std::string to_string(const IColumn& column, size_t row_num) const;
- void to_string(const IColumn &column, size_t row_num, BufferWritable
&ostr) const override;
+ void to_string(const IColumn& column, size_t row_num, BufferWritable&
ostr) const override;
static void cast_to_date(Int64& x);
};
diff --git a/be/src/vec/data_types/data_type_date_time.h
b/be/src/vec/data_types/data_type_date_time.h
index e2c6bc5..6b6af04 100644
--- a/be/src/vec/data_types/data_type_date_time.h
+++ b/be/src/vec/data_types/data_type_date_time.h
@@ -28,25 +28,25 @@ class DateLUTImpl;
namespace doris::vectorized {
/** DateTime stores time as unix timestamp.
- * The value itself is independent of time zone.
- *
- * In binary format it is represented as unix timestamp.
- * In text format it is serialized to and parsed from YYYY-MM-DD hh:mm:ss
format.
- * The text format is dependent of time zone.
- *
- * To convert from/to text format, time zone may be specified explicitly or
implicit time zone may be used.
- *
- * Time zone may be specified explicitly as type parameter, example:
DateTime('Europe/Moscow').
- * As it does not affect the internal representation of values,
- * all types with different time zones are equivalent and may be used
interchangingly.
- * Time zone only affects parsing and displaying in text formats.
- *
- * If time zone is not specified (example: DateTime without parameter), then
default time zone is used.
- * Default time zone is server time zone, if server is doing transformations
- * and if client is doing transformations, unless 'use_client_time_zone'
setting is passed to client;
- * Server time zone is the time zone specified in 'timezone' parameter in
configuration file,
- * or system time zone at the moment of server startup.
- */
+ * The value itself is independent of time zone.
+ *
+ * In binary format it is represented as unix timestamp.
+ * In text format it is serialized to and parsed from YYYY-MM-DD
hh:mm:ss format.
+ * The text format is dependent of time zone.
+ *
+ * To convert from/to text format, time zone may be specified explicitly
or implicit time zone may be used.
+ *
+ * Time zone may be specified explicitly as type parameter, example:
DateTime('Europe/Moscow').
+ * As it does not affect the internal representation of values,
+ * all types with different time zones are equivalent and may be used
interchangingly.
+ * Time zone only affects parsing and displaying in text formats.
+ *
+ * If time zone is not specified (example: DateTime without parameter),
then default time zone is used.
+ * Default time zone is server time zone, if server is doing
transformations
+ * and if client is doing transformations, unless
'use_client_time_zone' setting is passed to client;
+ * Server time zone is the time zone specified in 'timezone' parameter
in configuration file,
+ * or system time zone at the moment of server startup.
+ */
class DataTypeDateTime final : public DataTypeNumberBase<Int64> {
public:
DataTypeDateTime();
@@ -62,7 +62,7 @@ public:
std::string to_string(const IColumn& column, size_t row_num) const;
- void to_string(const IColumn &column, size_t row_num, BufferWritable
&ostr) const override;
+ void to_string(const IColumn& column, size_t row_num, BufferWritable&
ostr) const override;
static void cast_to_date_time(Int64& x);
};
diff --git a/be/src/vec/data_types/data_type_decimal.h
b/be/src/vec/data_types/data_type_decimal.h
index 3404eb3..5b6ab86 100644
--- a/be/src/vec/data_types/data_type_decimal.h
+++ b/be/src/vec/data_types/data_type_decimal.h
@@ -88,8 +88,8 @@ class DataTypeDecimal final : public IDataType {
static_assert(IsDecimalNumber<T>);
public:
- using FieldType = T;
using ColumnType = ColumnDecimal<T>;
+ using FieldType = T;
static constexpr bool is_parametric = true;
diff --git a/be/src/vec/data_types/data_type_number_base.h
b/be/src/vec/data_types/data_type_number_base.h
index df7d236..e19383e 100644
--- a/be/src/vec/data_types/data_type_number_base.h
+++ b/be/src/vec/data_types/data_type_number_base.h
@@ -35,6 +35,7 @@ class DataTypeNumberBase : public IDataType {
public:
static constexpr bool is_parametric = false;
+ using ColumnType = ColumnVector<T>;
using FieldType = T;
const char* get_family_name() const override { return TypeName<T>::get(); }
@@ -53,7 +54,9 @@ public:
bool is_value_represented_by_number() const override { return true; }
bool is_value_represented_by_integer() const override;
bool is_value_represented_by_unsigned_integer() const override;
- bool is_value_unambiguously_represented_in_contiguous_memory_region()
const override { return true; }
+ bool is_value_unambiguously_represented_in_contiguous_memory_region()
const override {
+ return true;
+ }
bool have_maximum_size_of_value() const override { return true; }
size_t get_size_of_value_in_memory() const override { return sizeof(T); }
bool is_categorial() const override { return
is_value_represented_by_integer(); }
diff --git a/be/src/vec/data_types/data_type_string.h
b/be/src/vec/data_types/data_type_string.h
index 0c4ef1e..9d5b21b 100644
--- a/be/src/vec/data_types/data_type_string.h
+++ b/be/src/vec/data_types/data_type_string.h
@@ -28,6 +28,7 @@ namespace doris::vectorized {
class DataTypeString final : public IDataType {
public:
+ using ColumnType = ColumnString;
using FieldType = String;
static constexpr bool is_parametric = false;
@@ -47,7 +48,9 @@ public:
bool have_subtypes() const override { return false; }
bool is_comparable() const override { return true; }
bool can_be_compared_with_collation() const override { return true; }
- bool is_value_unambiguously_represented_in_contiguous_memory_region()
const override { return true; }
+ bool is_value_unambiguously_represented_in_contiguous_memory_region()
const override {
+ return true;
+ }
bool is_categorial() const override { return true; }
bool can_be_inside_nullable() const override { return true; }
bool can_be_inside_low_cardinality() const override { return true; }
diff --git a/be/src/vec/functions/function_conv.cpp
b/be/src/vec/functions/function_conv.cpp
new file mode 100644
index 0000000..6f755ff
--- /dev/null
+++ b/be/src/vec/functions/function_conv.cpp
@@ -0,0 +1,163 @@
+// 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 "exprs/math_functions.h"
+#include "vec/data_types/data_type_number.h"
+#include "vec/data_types/data_type_string.h"
+#include "vec/functions/simple_function_factory.h"
+#include "vec/utils/util.hpp"
+
+namespace doris::vectorized {
+
+template <typename Impl>
+class FunctionConv : public IFunction {
+public:
+ static constexpr auto name = "conv";
+ String get_name() const override { return name; }
+ static FunctionPtr create() { return
std::make_shared<FunctionConv<Impl>>(); }
+
+ DataTypePtr get_return_type_impl(const DataTypes& arguments) const
override {
+ return make_nullable(std::make_shared<DataTypeString>());
+ }
+ DataTypes get_variadic_argument_types_impl() const override {
+ return {std::make_shared<typename Impl::DataType>(),
std::make_shared<DataTypeInt8>(),
+ std::make_shared<DataTypeInt8>()};
+ }
+ size_t get_number_of_arguments() const override {
+ return get_variadic_argument_types_impl().size();
+ }
+
+ bool use_default_implementation_for_nulls() const override { return false;
}
+ bool use_default_implementation_for_constants() const override { return
true; }
+
+ Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
+ size_t result, size_t input_rows_count) override {
+ auto result_column = ColumnString::create();
+ auto result_null_map_column = ColumnUInt8::create(input_rows_count, 0);
+
+ ColumnPtr argument_columns[3];
+
+ for (int i = 0; i < 3; ++i) {
+ argument_columns[i] = block.get_by_position(arguments[i]).column;
+ if (auto* nullable =
check_and_get_column<ColumnNullable>(*argument_columns[i])) {
+ argument_columns[i] = nullable->get_nested_column_ptr();
+
VectorizedUtils::update_null_map(result_null_map_column->get_data(),
+
nullable->get_null_map_data());
+ }
+ }
+
+ execute_straight(
+ context,
+ assert_cast<const typename
Impl::DataType::ColumnType*>(argument_columns[0].get()),
+ assert_cast<const ColumnInt8*>(argument_columns[1].get()),
+ assert_cast<const ColumnInt8*>(argument_columns[2].get()),
+ assert_cast<ColumnString*>(result_column.get()),
+
assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(),
+ input_rows_count);
+
+ block.get_by_position(result).column =
+ ColumnNullable::create(std::move(result_column),
std::move(result_null_map_column));
+ return Status::OK();
+ }
+
+private:
+ void execute_straight(FunctionContext* context,
+ const typename Impl::DataType::ColumnType*
data_column,
+ const ColumnInt8* src_base_column, const ColumnInt8*
dst_base_column,
+ ColumnString* result_column, NullMap&
result_null_map,
+ size_t input_rows_count) {
+ for (size_t i = 0; i < input_rows_count; i++) {
+ if (result_null_map[i]) {
+ result_column->insert_default();
+ continue;
+ }
+
+ Int8 src_base = src_base_column->get_element(i);
+ Int8 dst_base = dst_base_column->get_element(i);
+ if (std::abs(src_base) < MathFunctions::MIN_BASE ||
+ std::abs(src_base) > MathFunctions::MAX_BASE ||
+ std::abs(dst_base) < MathFunctions::MIN_BASE ||
+ std::abs(dst_base) > MathFunctions::MAX_BASE) {
+ result_null_map[i] = true;
+ result_column->insert_default();
+ continue;
+ }
+
+ Impl::calculate_cell(context, data_column, src_base, dst_base,
result_column,
+ result_null_map, i);
+ }
+ }
+};
+
+struct ConvInt64Impl {
+ using DataType = DataTypeInt64;
+
+ static void calculate_cell(FunctionContext* context, const
DataType::ColumnType* data_column,
+ const Int8 src_base, const Int8 dst_base,
+ ColumnString* result_column, NullMap&
result_null_map,
+ size_t index) {
+ Int64 num = data_column->get_element(index);
+ if (src_base < 0 && num >= 0) {
+ result_null_map[index] = true;
+ result_column->insert_default();
+ return;
+ }
+
+ int64_t decimal_num = num;
+ if (src_base != 10) {
+ if (!MathFunctions::decimal_in_base_to_decimal(num, src_base,
&decimal_num)) {
+ MathFunctions::handle_parse_result(dst_base, &decimal_num,
+
StringParser::PARSE_OVERFLOW);
+ }
+ }
+ StringVal str = MathFunctions::decimal_to_base(context, decimal_num,
dst_base);
+ result_column->insert_data(reinterpret_cast<const char*>(str.ptr),
str.len);
+ }
+};
+
+struct ConvStringImpl {
+ using DataType = DataTypeString;
+
+ static void calculate_cell(FunctionContext* context, const
DataType::ColumnType* data_column,
+ const Int8 src_base, const Int8 dst_base,
+ ColumnString* result_column, NullMap&
result_null_map,
+ size_t index) {
+ StringRef str = data_column->get_data_at(index);
+ StringParser::ParseResult parse_res;
+ int64_t decimal_num =
+ StringParser::string_to_int<int64_t>(str.data, str.size,
src_base, &parse_res);
+ if (src_base < 0 && decimal_num >= 0) {
+ result_null_map[index] = true;
+ result_column->insert_default();
+ return;
+ }
+
+ if (!MathFunctions::handle_parse_result(dst_base, &decimal_num,
parse_res)) {
+ result_column->insert_data("0", 1);
+ } else {
+ StringVal str = MathFunctions::decimal_to_base(context,
decimal_num, dst_base);
+ result_column->insert_data(reinterpret_cast<const char*>(str.ptr),
str.len);
+ }
+ }
+};
+
+void register_function_conv(SimpleFunctionFactory& factory) {
+ factory.register_function<FunctionConv<ConvInt64Impl>>();
+ factory.register_function<FunctionConv<ConvStringImpl>>();
+}
+
+} // namespace doris::vectorized
diff --git a/be/src/vec/functions/simple_function_factory.h
b/be/src/vec/functions/simple_function_factory.h
index d757920..0718930 100644
--- a/be/src/vec/functions/simple_function_factory.h
+++ b/be/src/vec/functions/simple_function_factory.h
@@ -36,6 +36,7 @@ void register_function_hll_hash(SimpleFunctionFactory&
factory);
void register_function_logical(SimpleFunctionFactory& factory);
void register_function_case(SimpleFunctionFactory& factory);
void register_function_cast(SimpleFunctionFactory& factory);
+void register_function_conv(SimpleFunctionFactory& factory);
void register_function_plus(SimpleFunctionFactory& factory);
void register_function_minus(SimpleFunctionFactory& factory);
void register_function_multiply(SimpleFunctionFactory& factory);
@@ -150,6 +151,7 @@ public:
register_function_logical(instance);
register_function_case(instance);
register_function_cast(instance);
+ register_function_conv(instance);
register_function_plus(instance);
register_function_minus(instance);
register_function_math(instance);
diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js
index fc5b0e6..7119bb0 100644
--- a/docs/.vuepress/sidebar/en.js
+++ b/docs/.vuepress/sidebar/en.js
@@ -451,6 +451,11 @@ module.exports = [
children: ["murmur_hash3_32"],
},
{
+ title: "Math Functions",
+ directoryPath: "math-functions/",
+ children: ["conv"],
+ },
+ {
title: "table functions",
directoryPath: "table-functions/",
children: [
diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js
index 2cb2847..26489ef 100644
--- a/docs/.vuepress/sidebar/zh-CN.js
+++ b/docs/.vuepress/sidebar/zh-CN.js
@@ -443,6 +443,11 @@ module.exports = [
children: ["murmur_hash3_32"],
},
{
+ title: "数学函数",
+ directoryPath: "math-functions/",
+ children: ["conv"],
+ },
+ {
title: "加密和信息摘要函数",
directoryPath: "encrypt-digest-functions/",
children: [
diff --git a/docs/en/sql-reference/sql-functions/math-functions/conv.md
b/docs/en/sql-reference/sql-functions/math-functions/conv.md
new file mode 100644
index 0000000..4ce1e18
--- /dev/null
+++ b/docs/en/sql-reference/sql-functions/math-functions/conv.md
@@ -0,0 +1,60 @@
+---
+{
+ "title": "conv",
+ "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.
+-->
+
+# conv
+
+## description
+### Syntax
+
+`VARCHAR CONV(VARCHAR input, TINYINT from_base, TINYINT to_base)`
+`VARCHAR CONV(BIGINT input, TINYINT from_base, TINYINT to_base)`
+Convert the input number to the target base. The input base range should be
within `[2,36]`.
+
+## example
+
+```
+MySQL [test]> SELECT CONV(15,10,2);
++-----------------+
+| conv(15, 10, 2) |
++-----------------+
+| 1111 |
++-----------------+
+
+MySQL [test]> SELECT CONV('ff',16,10);
++--------------------+
+| conv('ff', 16, 10) |
++--------------------+
+| 255 |
++--------------------+
+
+MySQL [test]> SELECT CONV(230,10,16);
++-------------------+
+| conv(230, 10, 16) |
++-------------------+
+| E6 |
++-------------------+
+```
+
+## keyword
+ CONV
diff --git a/docs/zh-CN/sql-reference/sql-functions/math-functions/conv.md
b/docs/zh-CN/sql-reference/sql-functions/math-functions/conv.md
new file mode 100644
index 0000000..280228e
--- /dev/null
+++ b/docs/zh-CN/sql-reference/sql-functions/math-functions/conv.md
@@ -0,0 +1,60 @@
+---
+{
+ "title": "conv",
+ "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.
+-->
+
+# conv
+
+## description
+### Syntax
+
+`VARCHAR CONV(VARCHAR input, TINYINT from_base, TINYINT to_base)`
+`VARCHAR CONV(BIGINT input, TINYINT from_base, TINYINT to_base)`
+对输入的数字进行进制转换,输入的进制范围应该在`[2,36]`以内。
+
+## example
+
+```
+MySQL [test]> SELECT CONV(15,10,2);
++-----------------+
+| conv(15, 10, 2) |
++-----------------+
+| 1111 |
++-----------------+
+
+MySQL [test]> SELECT CONV('ff',16,10);
++--------------------+
+| conv('ff', 16, 10) |
++--------------------+
+| 255 |
++--------------------+
+
+MySQL [test]> SELECT CONV(230,10,16);
++-------------------+
+| conv(230, 10, 16) |
++-------------------+
+| E6 |
++-------------------+
+```
+
+## keyword
+ CONV
diff --git a/gensrc/script/doris_builtins_functions.py
b/gensrc/script/doris_builtins_functions.py
index 211775a..1bc3d32 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -624,13 +624,13 @@ visible_functions = [
[['conv'], 'VARCHAR', ['BIGINT', 'TINYINT', 'TINYINT'],
'_ZN5doris13MathFunctions8conv_intEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValERKNS1_10TinyIntValES9_', '',
'', '', ''],
+ '15FunctionContextERKNS1_9BigIntValERKNS1_10TinyIntValES9_', '',
'', 'vec', 'ALWAYS_NULLABLE'],
[['conv'], 'VARCHAR', ['VARCHAR', 'TINYINT', 'TINYINT'],
'_ZN5doris13MathFunctions11conv_stringEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_', '',
'', '', ''],
+ '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_', '',
'', 'vec', 'ALWAYS_NULLABLE'],
[['conv'], 'VARCHAR', ['STRING', 'TINYINT', 'TINYINT'],
'_ZN5doris13MathFunctions11conv_stringEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_', '',
'', '', ''],
+ '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_', '',
'', 'vec', 'ALWAYS_NULLABLE'],
[['pmod'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris13MathFunctions11pmod_bigintEPN9doris_udf'
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]