You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2021/08/11 06:54:16 UTC
[incubator-doris] branch master updated: [New Featrue] Support
Vectorization Execution Engine Interface For Doris (#6329)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 9216735 [New Featrue] Support Vectorization Execution Engine Interface For Doris (#6329)
9216735 is described below
commit 9216735cfa30ae2ee06f962ee457bebdb51eed76
Author: HappenLee <ha...@hotmail.com>
AuthorDate: Wed Aug 11 01:54:06 2021 -0500
[New Featrue] Support Vectorization Execution Engine Interface For Doris (#6329)
1. FE vectorized plan code
2. Function register vec function
3. Diff function nullable type
4. New thirdparty code and new thrift struct
---
be/CMakeLists.txt | 2 +-
be/src/common/compiler_util.h | 5 +
be/src/common/logging.h | 1 +
be/src/common/status.h | 2 +
be/src/exec/aggregation_node.cpp | 13 +-
be/src/exec/broker_scan_node.cpp | 2 +-
be/src/exec/cross_join_node.cpp | 2 +-
be/src/exec/data_sink.cpp | 24 +-
be/src/exec/data_sink.h | 1 +
be/src/exec/exec_node.cpp | 62 +-
be/src/exec/exec_node.h | 7 +-
be/src/exec/olap_scan_node.cpp | 23 +-
be/src/exec/olap_scan_node.h | 11 +-
be/src/exec/olap_scanner.cpp | 1 -
be/src/exec/olap_scanner.h | 8 +-
be/src/exec/partitioned_aggregation_node.cc | 32 +-
be/src/exec/schema_scan_node.cpp | 2 +-
be/src/exec/schema_scanner.cpp | 6 +-
be/src/exprs/agg_fn_evaluator.cpp | 4 +-
be/src/exprs/agg_fn_evaluator.h | 14 +-
be/src/exprs/aggregate_functions.cpp | 104 ++-
be/src/exprs/aggregate_functions.h | 19 +-
be/src/exprs/anyval_util.h | 40 +
be/src/exprs/expr_value.h | 4 +-
be/src/exprs/hll_function.cpp | 8 +-
be/src/exprs/hll_function.h | 3 +
be/src/exprs/hybrid_set.h | 2 +-
be/src/exprs/new_agg_fn_evaluator.cc | 6 +-
be/src/exprs/new_agg_fn_evaluator.h | 22 +-
be/src/exprs/timestamp_functions.cpp | 87 +-
be/src/exprs/timestamp_functions.h | 2 +
be/src/olap/block_column_predicate.h | 2 +-
be/src/olap/rowset/segment_v2/segment_iterator.cpp | 2 +-
be/src/runtime/data_stream_recvr.cc | 2 -
be/src/runtime/data_stream_sender.cpp | 6 +-
be/src/runtime/datetime_value.cpp | 12 +-
be/src/runtime/datetime_value.h | 115 ++-
be/src/runtime/descriptors.cpp | 16 +
be/src/runtime/descriptors.h | 15 +
be/src/runtime/exec_env.h | 4 +-
be/src/runtime/mysql_result_writer.cpp | 9 +-
be/src/runtime/mysql_result_writer.h | 12 +-
be/src/runtime/plan_fragment_executor.cpp | 15 +-
be/src/runtime/plan_fragment_executor.h | 2 +
be/src/runtime/result_sink.cpp | 1 +
be/src/runtime/result_sink.h | 6 +
be/src/runtime/result_writer.h | 10 +-
be/src/runtime/row_batch.cpp | 3 +
be/src/runtime/row_batch.h | 5 +
be/src/runtime/runtime_state.h | 2 +
be/src/runtime/type_limit.h | 8 +-
be/src/runtime/types.h | 6 +
be/src/service/internal_service.cpp | 12 +
be/src/service/internal_service.h | 4 +
be/src/util/binary_cast.hpp | 35 +-
be/src/util/bitmap_value.h | 2 +-
be/src/util/brpc_stub_cache.h | 8 +-
be/src/util/hash_util.hpp | 2 +-
be/src/util/radix_sort.h | 2 +-
be/test/exec/broker_scan_node_test.cpp | 1 +
be/test/exec/json_scanner_test.cpp | 2 +
be/test/exec/json_scanner_test_with_jsonpath.cpp | 1 +
be/test/exec/parquet_scanner_test.cpp | 1 +
be/test/olap/column_reader_test.cpp | 188 ++---
be/test/olap/schema_change_test.cpp | 44 +-
be/test/runtime/CMakeLists.txt | 2 +-
be/test/runtime/memory_scratch_sink_test.cpp | 1 +
be/test/util/arrow/arrow_work_flow_test.cpp | 1 +
build.sh | 10 +-
.../apache/doris/analysis/AggregateInfoBase.java | 32 +-
.../org/apache/doris/analysis/ArithmeticExpr.java | 199 +++--
.../org/apache/doris/analysis/BinaryPredicate.java | 22 +-
.../java/org/apache/doris/analysis/CaseExpr.java | 27 +
.../java/org/apache/doris/analysis/CastExpr.java | 37 +-
.../apache/doris/analysis/CompoundPredicate.java | 17 +
.../org/apache/doris/analysis/DateLiteral.java | 17 +-
.../main/java/org/apache/doris/analysis/Expr.java | 70 +-
.../apache/doris/analysis/ExpressionFunctions.java | 3 +-
.../apache/doris/analysis/FunctionCallExpr.java | 10 +-
.../org/apache/doris/analysis/InPredicate.java | 8 +-
.../org/apache/doris/analysis/InlineViewRef.java | 5 +-
.../org/apache/doris/analysis/IsNullPredicate.java | 8 +-
.../org/apache/doris/analysis/LikePredicate.java | 17 +-
.../org/apache/doris/analysis/LiteralExpr.java | 5 +
.../org/apache/doris/analysis/SlotDescriptor.java | 1 +
.../java/org/apache/doris/analysis/SlotRef.java | 5 +
.../apache/doris/catalog/AggregateFunction.java | 118 ++-
.../java/org/apache/doris/catalog/Catalog.java | 13 +-
.../java/org/apache/doris/catalog/Function.java | 60 +-
.../java/org/apache/doris/catalog/FunctionSet.java | 452 +++++++++-
.../org/apache/doris/catalog/ScalarFunction.java | 196 +++--
.../doris/common/profile/ProfileTreeBuilder.java | 5 +-
.../apache/doris/common/util/VectorizedUtil.java | 25 +-
.../org/apache/doris/planner/AggregationNode.java | 1 -
.../java/org/apache/doris/planner/PlanNode.java | 67 +-
.../java/org/apache/doris/planner/Planner.java | 5 +
.../java/org/apache/doris/planner/ResultSink.java | 7 +-
.../apache/doris/planner/SingleNodePlanner.java | 4 +-
.../main/java/org/apache/doris/qe/Coordinator.java | 1 +
.../java/org/apache/doris/qe/SessionVariable.java | 19 +-
.../java/org/apache/doris/qe/StmtExecutor.java | 3 +-
.../org/apache/doris/analysis/CaseExprTest.java | 69 ++
.../org/apache/doris/catalog/FunctionSetTest.java | 8 +-
.../java/org/apache/doris/planner/PlannerTest.java | 2 +-
.../doris/planner/StreamLoadScanNodeTest.java | 4 +-
fe/fe-core/src/test/resources/log4j2.xml | 2 +-
gensrc/proto/data.proto | 54 +-
gensrc/proto/internal_service.proto | 3 +
gensrc/proto/palo_internal_service.proto | 47 ++
gensrc/script/doris_builtins_functions.py | 927 +++++++++++++--------
gensrc/script/gen_builtins_functions.py | 45 +-
gensrc/thrift/DataSinks.thrift | 4 +-
gensrc/thrift/Exprs.thrift | 3 +
gensrc/thrift/PaloInternalService.thrift | 5 +-
gensrc/thrift/PlanNodes.thrift | 4 +-
gensrc/thrift/Status.thrift | 12 +-
gensrc/thrift/Types.thrift | 1 +
run-be-ut.sh | 2 +-
thirdparty/build-thirdparty.sh | 16 +
thirdparty/vars.sh | 16 +-
120 files changed, 2746 insertions(+), 1025 deletions(-)
diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt
index 38ef7f9..a4ec87d 100644
--- a/be/CMakeLists.txt
+++ b/be/CMakeLists.txt
@@ -329,7 +329,7 @@ check_function_exists(sched_getcpu HAVE_SCHED_GETCPU)
# -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG: enable nanosecond precision for boost
# -fno-omit-frame-pointers: Keep frame pointer for functions in register
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall -Wno-sign-compare -Wno-unknown-pragmas -pthread -Werror=strict-aliasing")
-set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fno-omit-frame-pointer")
+set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fstrict-aliasing -fno-omit-frame-pointer -Werror=return-type")
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -std=gnu++17 -D__STDC_FORMAT_MACROS")
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated -Wno-vla")
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG")
diff --git a/be/src/common/compiler_util.h b/be/src/common/compiler_util.h
index accc70c..1482134 100644
--- a/be/src/common/compiler_util.h
+++ b/be/src/common/compiler_util.h
@@ -42,7 +42,12 @@
/// not a command. This should be used sparingly for cases when either the function
/// needs to be inlined for a specific reason or the compiler's heuristics make a bad
/// decision, e.g. not inlining a small function on a hot path.
+#ifdef ALWAYS_INLINE
+#undef ALWAYS_INLINE
+#endif
#define ALWAYS_INLINE __attribute__((always_inline))
+#define NO_INLINE __attribute__((__noinline__))
+#define MAY_ALIAS __attribute__((__may_alias__))
#define ALIGN_CACHE_LINE __attribute__((aligned(CACHE_LINE_SIZE)))
diff --git a/be/src/common/logging.h b/be/src/common/logging.h
index 62265ce..7c4d35e 100644
--- a/be/src/common/logging.h
+++ b/be/src/common/logging.h
@@ -85,4 +85,5 @@
DCHECK(a == b) << "[ " #a " = " << static_cast<int>(a) << " , " #b " = " \
<< static_cast<int>(b) << " ]"
+#include <fmt/format.h>
#endif
diff --git a/be/src/common/status.h b/be/src/common/status.h
index 9f95472..50cffd1 100644
--- a/be/src/common/status.h
+++ b/be/src/common/status.h
@@ -235,6 +235,8 @@ public:
/// trailing message.
Status clone_and_append(const Slice& msg) const;
+ operator bool() { return this->ok(); }
+
private:
const char* copy_state(const char* state);
diff --git a/be/src/exec/aggregation_node.cpp b/be/src/exec/aggregation_node.cpp
index 43e3bd8..df3bc53 100644
--- a/be/src/exec/aggregation_node.cpp
+++ b/be/src/exec/aggregation_node.cpp
@@ -19,7 +19,6 @@
#include <gperftools/profiler.h>
#include <math.h>
-#include <thrift/protocol/TDebugProtocol.h>
#include <sstream>
@@ -223,6 +222,15 @@ Status AggregationNode::open(RuntimeState* state) {
}
Status AggregationNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eos) {
+ // 1. `!need_finalize` means this aggregation node not the level two aggregation node
+ // 2. `_singleton_output_tuple != nullptr` means is not group by
+ // 3. `child(0)->rows_returned() == 0` mean not data from child
+ // in level two aggregation node should return NULL result
+ // level one aggregation node set `eos = true` return directly
+ if (UNLIKELY(!_needs_finalize && _singleton_output_tuple != nullptr && child(0)->rows_returned() == 0)) {
+ *eos = true;
+ return Status::OK();
+ }
SCOPED_TIMER(_runtime_profile->total_time_counter());
RETURN_IF_ERROR(exec_debug_action(TExecNodePhase::GETNEXT));
RETURN_IF_CANCELLED(state);
@@ -403,7 +411,8 @@ Tuple* AggregationNode::finalize_tuple(Tuple* tuple, MemPool* pool) {
dst = Tuple::create(_output_tuple_desc->byte_size(), pool);
}
if (_needs_finalize) {
- AggFnEvaluator::finalize(_aggregate_evaluators, _agg_fn_ctxs, tuple, dst);
+ AggFnEvaluator::finalize(_aggregate_evaluators, _agg_fn_ctxs, tuple, dst,
+ _singleton_output_tuple != nullptr && child(0)->rows_returned() == 0);
} else {
AggFnEvaluator::serialize(_aggregate_evaluators, _agg_fn_ctxs, tuple);
}
diff --git a/be/src/exec/broker_scan_node.cpp b/be/src/exec/broker_scan_node.cpp
index 348729a..7c696b6 100644
--- a/be/src/exec/broker_scan_node.cpp
+++ b/be/src/exec/broker_scan_node.cpp
@@ -47,7 +47,7 @@ BrokerScanNode::BrokerScanNode(ObjectPool* pool, const TPlanNode& tnode, const D
BrokerScanNode::~BrokerScanNode() {}
Status BrokerScanNode::init(const TPlanNode& tnode, RuntimeState* state) {
- RETURN_IF_ERROR(ScanNode::init(tnode));
+ RETURN_IF_ERROR(ScanNode::init(tnode, state));
auto& broker_scan_node = tnode.broker_scan_node;
if (broker_scan_node.__isset.pre_filter_exprs) {
diff --git a/be/src/exec/cross_join_node.cpp b/be/src/exec/cross_join_node.cpp
index 177df55..8ef9b66 100644
--- a/be/src/exec/cross_join_node.cpp
+++ b/be/src/exec/cross_join_node.cpp
@@ -60,7 +60,7 @@ Status CrossJoinNode::construct_build_side(RuntimeState* state) {
RETURN_IF_CANCELLED(state);
// TODO(zhaochun):
// RETURN_IF_ERROR(state->CheckQueryState());
- bool eos = true;
+ bool eos = false;
RETURN_IF_ERROR(child(1)->get_next(state, batch, &eos));
// to prevent use too many memory
diff --git a/be/src/exec/data_sink.cpp b/be/src/exec/data_sink.cpp
index ef85dbc..123f621 100644
--- a/be/src/exec/data_sink.cpp
+++ b/be/src/exec/data_sink.cpp
@@ -42,6 +42,7 @@ Status DataSink::create_data_sink(ObjectPool* pool, const TDataSink& thrift_sink
const std::vector<TExpr>& output_exprs,
const TPlanFragmentExecParams& params,
const RowDescriptor& row_desc,
+ bool is_vec,
boost::scoped_ptr<DataSink>* sink) {
DataSink* tmp_sink = NULL;
@@ -55,9 +56,12 @@ Status DataSink::create_data_sink(ObjectPool* pool, const TDataSink& thrift_sink
? params.send_query_statistics_with_every_batch
: false;
// TODO: figure out good buffer size based on size of output row
- tmp_sink = new DataStreamSender(pool, params.sender_id, row_desc, thrift_sink.stream_sink,
- params.destinations, 16 * 1024,
- send_query_statistics_with_every_batch);
+ if (is_vec) {
+ } else {
+ tmp_sink = new DataStreamSender(pool, params.sender_id, row_desc, thrift_sink.stream_sink,
+ params.destinations, 16 * 1024,
+ send_query_statistics_with_every_batch);
+ }
// RETURN_IF_ERROR(sender->prepare(state->obj_pool(), thrift_sink.stream_sink));
sink->reset(tmp_sink);
break;
@@ -68,7 +72,10 @@ Status DataSink::create_data_sink(ObjectPool* pool, const TDataSink& thrift_sink
}
// TODO: figure out good buffer size based on size of output row
- tmp_sink = new ResultSink(row_desc, output_exprs, thrift_sink.result_sink, 1024);
+ if (is_vec) {
+ } else {
+ tmp_sink = new ResultSink(row_desc, output_exprs, thrift_sink.result_sink, 1024);
+ }
sink->reset(tmp_sink);
break;
case TDataSinkType::MEMORY_SCRATCH_SINK:
@@ -98,8 +105,7 @@ Status DataSink::create_data_sink(ObjectPool* pool, const TDataSink& thrift_sink
if (!thrift_sink.__isset.odbc_table_sink) {
return Status::InternalError("Missing data odbc sink.");
}
- OdbcTableSink* odbc_tbl_sink = new OdbcTableSink(pool,
- row_desc, output_exprs);
+ OdbcTableSink* odbc_tbl_sink = new OdbcTableSink(pool, row_desc, output_exprs);
sink->reset(odbc_tbl_sink);
break;
}
@@ -158,9 +164,9 @@ Status DataSink::init(const TDataSink& thrift_sink) {
}
Status DataSink::prepare(RuntimeState* state) {
- _expr_mem_tracker = MemTracker::CreateTracker(
- -1, _name + ":Expr:" + std::to_string(state->load_job_id()),
- state->instance_mem_tracker());
+ _expr_mem_tracker =
+ MemTracker::CreateTracker(-1, _name + ":Expr:" + std::to_string(state->load_job_id()),
+ state->instance_mem_tracker());
return Status::OK();
}
diff --git a/be/src/exec/data_sink.h b/be/src/exec/data_sink.h
index e4c6729..e351427 100644
--- a/be/src/exec/data_sink.h
+++ b/be/src/exec/data_sink.h
@@ -74,6 +74,7 @@ public:
const std::vector<TExpr>& output_exprs,
const TPlanFragmentExecParams& params,
const RowDescriptor& row_desc,
+ bool is_vec,
boost::scoped_ptr<DataSink>* sink);
// Returns the runtime profile for the sink.
diff --git a/be/src/exec/exec_node.cpp b/be/src/exec/exec_node.cpp
index 675cb1e..18b5af1 100644
--- a/be/src/exec/exec_node.cpp
+++ b/be/src/exec/exec_node.cpp
@@ -127,9 +127,7 @@ ExecNode::ExecNode(ObjectPool* pool, const TPlanNode& tnode, const DescriptorTbl
_rows_returned_counter(NULL),
_rows_returned_rate(NULL),
_memory_used_counter(NULL),
- _is_closed(false) {
- init_runtime_profile(print_plan_node_type(tnode.node_type));
-}
+ _is_closed(false) {}
ExecNode::~ExecNode() {}
@@ -159,7 +157,18 @@ void ExecNode::push_down_predicate(RuntimeState* state, std::list<ExprContext*>*
}
Status ExecNode::init(const TPlanNode& tnode, RuntimeState* state) {
+ std::string profile;
+ if (state && state->enable_vectorized_exec()) {
+ profile = "V" + print_plan_node_type(tnode.node_type);
+ } else {
+ profile = print_plan_node_type(tnode.node_type);
+ }
+ init_runtime_profile(profile);
+
+ if (tnode.__isset.vconjunct) {
+ }
RETURN_IF_ERROR(Expr::create_expr_trees(_pool, tnode.conjuncts, &_conjunct_ctxs));
+
return Status::OK();
}
@@ -178,11 +187,11 @@ Status ExecNode::prepare(RuntimeState* state) {
_expr_mem_tracker = MemTracker::CreateTracker(-1, "ExecNode:Exprs:" + _runtime_profile->name(),
_mem_tracker);
_expr_mem_pool.reset(new MemPool(_expr_mem_tracker.get()));
- // TODO chenhao
+
RETURN_IF_ERROR(Expr::prepare(_conjunct_ctxs, state, row_desc(), expr_mem_tracker()));
+
// TODO(zc):
// AddExprCtxsToFree(_conjunct_ctxs);
-
for (int i = 0; i < _children.size(); ++i) {
RETURN_IF_ERROR(_children[i]->prepare(state));
}
@@ -362,22 +371,32 @@ Status ExecNode::create_node(RuntimeState* state, ObjectPool* pool, const TPlanN
return Status::OK();
case TPlanNodeType::OLAP_SCAN_NODE:
- *node = pool->add(new OlapScanNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
+ } else {
+ *node = pool->add(new OlapScanNode(pool, tnode, descs));
+ }
return Status::OK();
case TPlanNodeType::AGGREGATION_NODE:
- if (config::enable_partitioned_aggregation) {
- *node = pool->add(new PartitionedAggregationNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
} else {
- *node = pool->add(new AggregationNode(pool, tnode, descs));
+ if (config::enable_partitioned_aggregation) {
+ *node = pool->add(new PartitionedAggregationNode(pool, tnode, descs));
+ } else {
+ *node = pool->add(new AggregationNode(pool, tnode, descs));
+ }
}
return Status::OK();
+
case TPlanNodeType::HASH_JOIN_NODE:
*node = pool->add(new HashJoinNode(pool, tnode, descs));
return Status::OK();
case TPlanNodeType::CROSS_JOIN_NODE:
- *node = pool->add(new CrossJoinNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
+ } else {
+ *node = pool->add(new CrossJoinNode(pool, tnode, descs));
+ }
return Status::OK();
case TPlanNodeType::MERGE_JOIN_NODE:
@@ -389,7 +408,10 @@ Status ExecNode::create_node(RuntimeState* state, ObjectPool* pool, const TPlanN
return Status::OK();
case TPlanNodeType::EXCHANGE_NODE:
- *node = pool->add(new ExchangeNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
+ } else {
+ *node = pool->add(new ExchangeNode(pool, tnode, descs));
+ }
return Status::OK();
case TPlanNodeType::SELECT_NODE:
@@ -401,10 +423,13 @@ Status ExecNode::create_node(RuntimeState* state, ObjectPool* pool, const TPlanN
return Status::OK();
case TPlanNodeType::SORT_NODE:
- if (tnode.sort_node.use_top_n) {
- *node = pool->add(new TopNNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
} else {
- *node = pool->add(new SpillSortNode(pool, tnode, descs));
+ if (tnode.sort_node.use_top_n) {
+ *node = pool->add(new TopNNode(pool, tnode, descs));
+ } else {
+ *node = pool->add(new SpillSortNode(pool, tnode, descs));
+ }
}
return Status::OK();
@@ -417,7 +442,10 @@ Status ExecNode::create_node(RuntimeState* state, ObjectPool* pool, const TPlanN
return Status::OK();
case TPlanNodeType::UNION_NODE:
- *node = pool->add(new UnionNode(pool, tnode, descs));
+ if (state->enable_vectorized_exec()) {
+ } else {
+ *node = pool->add(new UnionNode(pool, tnode, descs));
+ }
return Status::OK();
case TPlanNodeType::INTERSECT_NODE:
@@ -624,4 +652,8 @@ Status ExecNode::QueryMaintenance(RuntimeState* state, const std::string& msg) {
return state->check_query_state(msg);
}
+Status ExecNode::get_next(RuntimeState* state, vectorized::Block* block, bool* eos) {
+ return Status::NotSupported("Not Implemented get block");
+}
+
} // namespace doris
diff --git a/be/src/exec/exec_node.h b/be/src/exec/exec_node.h
index 74baa27..dfaeb2c 100644
--- a/be/src/exec/exec_node.h
+++ b/be/src/exec/exec_node.h
@@ -34,7 +34,6 @@
#include "util/uid_util.h" // for print_id
namespace doris {
-
class Expr;
class ExprContext;
class ObjectPool;
@@ -46,6 +45,11 @@ class TupleRow;
class DataSink;
class MemTracker;
+namespace vectorized {
+class Block;
+class VExpr;
+}
+
using std::string;
using std::stringstream;
using std::vector;
@@ -97,6 +101,7 @@ public:
// Caller must not be holding any io buffers. This will cause deadlock.
// TODO: AggregationNode and HashJoinNode cannot be "re-opened" yet.
virtual Status get_next(RuntimeState* state, RowBatch* row_batch, bool* eos) = 0;
+ virtual Status get_next(RuntimeState* state, vectorized::Block* block, bool* eos);
// Resets the stream of row batches to be retrieved by subsequent GetNext() calls.
// Clears all internal state, returning this node to the state it was in after calling
diff --git a/be/src/exec/olap_scan_node.cpp b/be/src/exec/olap_scan_node.cpp
index 3da65b4..d1f63c1 100644
--- a/be/src/exec/olap_scan_node.cpp
+++ b/be/src/exec/olap_scan_node.cpp
@@ -20,14 +20,12 @@
#include <algorithm>
#include <boost/variant.hpp>
#include <iostream>
-#include <sstream>
#include <string>
#include <utility>
#include "agent/cgroups_mgr.h"
#include "common/logging.h"
#include "common/resource_tls.h"
-#include "exprs/binary_predicate.h"
#include "exprs/expr.h"
#include "exprs/expr_context.h"
#include "exprs/runtime_filter.h"
@@ -38,7 +36,6 @@
#include "runtime/runtime_state.h"
#include "runtime/string_value.h"
#include "runtime/tuple_row.h"
-#include "util/debug_util.h"
#include "util/priority_thread_pool.hpp"
#include "util/runtime_profile.h"
@@ -68,7 +65,7 @@ OlapScanNode::~OlapScanNode() {}
Status OlapScanNode::init(const TPlanNode& tnode, RuntimeState* state) {
RETURN_IF_ERROR(ExecNode::init(tnode, state));
- _direct_conjunct_size = _conjunct_ctxs.size();
+ _direct_conjunct_size = state->enable_vectorized_exec() ? 1 : _conjunct_ctxs.size();
const TQueryOptions& query_options = state->query_options();
if (query_options.__isset.max_scan_key_num) {
@@ -157,6 +154,9 @@ void OlapScanNode::_init_counter(RuntimeState* state) {
_scanner_wait_batch_timer = ADD_TIMER(_runtime_profile, "ScannerBatchWaitTime");
// time of scan thread to wait for worker thread of the thread pool
_scanner_wait_worker_timer = ADD_TIMER(_runtime_profile, "ScannerWorkerWaitTime");
+
+ // time of node to wait for batch/block queue
+ _olap_wait_batch_queue_timer = ADD_TIMER(_runtime_profile, "BatchQueueWaitTime");
}
Status OlapScanNode::prepare(RuntimeState* state) {
@@ -286,6 +286,7 @@ Status OlapScanNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eo
RowBatch* materialized_batch = NULL;
{
std::unique_lock<std::mutex> l(_row_batches_lock);
+ SCOPED_TIMER(_olap_wait_batch_queue_timer);
while (_materialized_row_batches.empty() && !_transfer_done) {
if (state->is_cancelled()) {
_transfer_done = true;
@@ -454,6 +455,7 @@ Status OlapScanNode::start_scan(RuntimeState* state) {
VLOG_CRITICAL << "Filter idle conjuncts";
// 4. Filter idle conjunct which already trans to olap filters`
+ // TODO: filter idle conjunct in vexpr_contexts
remove_pushed_conjuncts(state);
VLOG_CRITICAL << "BuildScanKey";
@@ -515,6 +517,9 @@ void OlapScanNode::remove_pushed_conjuncts(RuntimeState* state) {
iter->second->runtimefilter->set_push_down_profile();
}
}
+ // set vconjunct_ctx is empty, if all conjunct
+ if (_direct_conjunct_size == 0) {
+ }
}
void OlapScanNode::eval_const_conjuncts() {
@@ -654,11 +659,11 @@ Status OlapScanNode::build_scan_key() {
return Status::OK();
}
-static Status get_hints(const TPaloScanRange& scan_range, int block_row_count,
- bool is_begin_include, bool is_end_include,
- const std::vector<std::unique_ptr<OlapScanRange>>& scan_key_range,
- std::vector<std::unique_ptr<OlapScanRange>>* sub_scan_range,
- RuntimeProfile* profile) {
+Status OlapScanNode::get_hints(const TPaloScanRange& scan_range, int block_row_count,
+ bool is_begin_include, bool is_end_include,
+ const std::vector<std::unique_ptr<OlapScanRange>>& scan_key_range,
+ std::vector<std::unique_ptr<OlapScanRange>>* sub_scan_range,
+ RuntimeProfile* profile) {
auto tablet_id = scan_range.tablet_id;
int32_t schema_hash = strtoul(scan_range.schema_hash.c_str(), NULL, 10);
std::string err;
diff --git a/be/src/exec/olap_scan_node.h b/be/src/exec/olap_scan_node.h
index 8e59e23..c7142a5 100644
--- a/be/src/exec/olap_scan_node.h
+++ b/be/src/exec/olap_scan_node.h
@@ -148,7 +148,7 @@ protected:
Status normalize_conjuncts();
Status build_olap_filters();
Status build_scan_key();
- Status start_scan_thread(RuntimeState* state);
+ virtual Status start_scan_thread(RuntimeState* state);
template <class T>
Status normalize_predicate(ColumnValueRange<T>& range, SlotDescriptor* slot);
@@ -179,7 +179,6 @@ protected:
const std::vector<TRuntimeFilterDesc>& runtime_filter_descs() { return _runtime_filter_descs; }
-private:
void _init_counter(RuntimeState* state);
// OLAP_SCAN_NODE profile layering: OLAP_SCAN_NODE, OlapScanner, and SegmentIterator
// according to the calling relationship
@@ -194,6 +193,12 @@ private:
std::pair<bool, void*> should_push_down_eq_predicate(SlotDescriptor* slot, Expr* pred,
int conj_idx, int child_idx);
+ static Status get_hints(const TPaloScanRange& scan_range, int block_row_count,
+ bool is_begin_include, bool is_end_include,
+ const std::vector<std::unique_ptr<OlapScanRange>>& scan_key_range,
+ std::vector<std::unique_ptr<OlapScanRange>>* sub_scan_range,
+ RuntimeProfile* profile);
+
friend class OlapScanner;
// Tuple id resolved in prepare() to set _tuple_desc;
@@ -356,6 +361,8 @@ private:
RuntimeProfile::Counter* _scanner_wait_batch_timer = nullptr;
RuntimeProfile::Counter* _scanner_wait_worker_timer = nullptr;
+
+ RuntimeProfile::Counter* _olap_wait_batch_queue_timer = nullptr;
};
} // namespace doris
diff --git a/be/src/exec/olap_scanner.cpp b/be/src/exec/olap_scanner.cpp
index ebe2200..64053e9 100644
--- a/be/src/exec/olap_scanner.cpp
+++ b/be/src/exec/olap_scanner.cpp
@@ -17,7 +17,6 @@
#include "olap_scanner.h"
-#include <cstring>
#include <string>
#include "gen_cpp/PaloInternalService_types.h"
diff --git a/be/src/exec/olap_scanner.h b/be/src/exec/olap_scanner.h
index 6dbd2fd..65f6208 100644
--- a/be/src/exec/olap_scanner.h
+++ b/be/src/exec/olap_scanner.h
@@ -94,7 +94,11 @@ public:
std::vector<bool>* mutable_runtime_filter_marks() { return &_runtime_filter_marks; }
-private:
+ const std::vector<SlotDescriptor*>& get_query_slots() const {
+ return _query_slots;
+ }
+
+protected:
Status _init_params(const std::vector<OlapScanRange*>& key_ranges,
const std::vector<TCondition>& filters,
const std::vector<std::pair<string, std::shared_ptr<IBloomFilterFuncBase>>>&
@@ -105,7 +109,7 @@ private:
// Update profile that need to be reported in realtime.
void _update_realtime_counter();
-private:
+protected:
RuntimeState* _runtime_state;
OlapScanNode* _parent;
const TupleDescriptor* _tuple_desc; /**< tuple descriptor */
diff --git a/be/src/exec/partitioned_aggregation_node.cc b/be/src/exec/partitioned_aggregation_node.cc
index 7e5d5f3..8f31ad8 100644
--- a/be/src/exec/partitioned_aggregation_node.cc
+++ b/be/src/exec/partitioned_aggregation_node.cc
@@ -30,7 +30,6 @@
#include "exprs/new_agg_fn_evaluator.h"
// #include "exprs/scalar_expr_evaluator.h"
#include "exprs/slot_ref.h"
-#include "gen_cpp/Exprs_types.h"
#include "gen_cpp/PlanNodes_types.h"
#include "gutil/strings/substitute.h"
#include "runtime/buffered_tuple_stream3.inline.h"
@@ -147,7 +146,7 @@ PartitionedAggregationNode::PartitionedAggregationNode(ObjectPool* pool, const T
}
Status PartitionedAggregationNode::init(const TPlanNode& tnode, RuntimeState* state) {
- RETURN_IF_ERROR(ExecNode::init(tnode));
+ RETURN_IF_ERROR(ExecNode::init(tnode, state));
DCHECK(intermediate_tuple_desc_ != nullptr);
DCHECK(output_tuple_desc_ != nullptr);
DCHECK_EQ(intermediate_tuple_desc_->slots().size(), output_tuple_desc_->slots().size());
@@ -345,6 +344,15 @@ Status PartitionedAggregationNode::open(RuntimeState* state) {
}
Status PartitionedAggregationNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eos) {
+ // 1. `!need_finalize` means this aggregation node not the level two aggregation node
+ // 2. `grouping_exprs_.size() == 0 ` means is not group by
+ // 3. `child(0)->rows_returned() == 0` mean not data from child
+ // in level two aggregation node should return NULL result
+ // level one aggregation node set `eos = true` return directly
+ if (UNLIKELY(grouping_exprs_.size() == 0 && !needs_finalize_ && child(0)->rows_returned() == 0)) {
+ *eos = true;
+ return Status::OK();
+ }
// PartitionedAggregationNode is a spill node, GetNextInternal will read tuple from a tuple stream
// then copy the pointer to a RowBatch, it can only guarantee that the life cycle is valid in a batch stage.
// If the ancestor node is a no-spilling blocking node (such as hash_join_node except_node ...)
@@ -1014,23 +1022,6 @@ void PartitionedAggregationNode::InitAggSlots(const vector<NewAggFnEvaluator*>&
// initialize the value to max/min possible value for the same effect.
NewAggFnEvaluator* eval = agg_fn_evals[i];
eval->Init(intermediate_tuple);
-
- DCHECK(agg_fns_[i] == &(eval->agg_fn()));
- const AggFn* agg_fn = agg_fns_[i];
- const AggFn::AggregationOp agg_op = agg_fn->agg_op();
- if ((agg_op == AggFn::MIN || agg_op == AggFn::MAX) &&
- !agg_fn->intermediate_type().is_string_type() &&
- !agg_fn->intermediate_type().is_date_type()) {
- ExprValue default_value;
- void* default_value_ptr = NULL;
- if (agg_op == AggFn::MIN) {
- default_value_ptr = default_value.set_to_max((*slot_desc)->type());
- } else {
- DCHECK_EQ(agg_op, AggFn::MAX);
- default_value_ptr = default_value.set_to_min((*slot_desc)->type());
- }
- RawValue::write(default_value_ptr, intermediate_tuple, *slot_desc, NULL);
- }
}
}
@@ -1054,7 +1045,8 @@ Tuple* PartitionedAggregationNode::GetOutputTuple(const vector<NewAggFnEvaluator
dst = Tuple::create(output_tuple_desc_->byte_size(), pool);
}
if (needs_finalize_) {
- NewAggFnEvaluator::Finalize(agg_fn_evals, tuple, dst);
+ NewAggFnEvaluator::Finalize(agg_fn_evals, tuple, dst,
+ grouping_exprs_.size() == 0 && child(0)->rows_returned() == 0);
} else {
NewAggFnEvaluator::Serialize(agg_fn_evals, tuple);
}
diff --git a/be/src/exec/schema_scan_node.cpp b/be/src/exec/schema_scan_node.cpp
index b9c26ad..1a6352c 100644
--- a/be/src/exec/schema_scan_node.cpp
+++ b/be/src/exec/schema_scan_node.cpp
@@ -51,7 +51,7 @@ SchemaScanNode::~SchemaScanNode() {
}
Status SchemaScanNode::init(const TPlanNode& tnode, RuntimeState* state) {
- RETURN_IF_ERROR(ExecNode::init(tnode));
+ RETURN_IF_ERROR(ExecNode::init(tnode, state));
if (tnode.schema_scan_node.__isset.db) {
_scanner_param.db = _pool->add(new std::string(tnode.schema_scan_node.db));
}
diff --git a/be/src/exec/schema_scanner.cpp b/be/src/exec/schema_scanner.cpp
index 4cbbb31..ef9ded8 100644
--- a/be/src/exec/schema_scanner.cpp
+++ b/be/src/exec/schema_scanner.cpp
@@ -127,7 +127,11 @@ Status SchemaScanner::create_tuple_desc(ObjectPool* pool) {
for (int i = 0; i < _column_num; ++i) {
TSlotDescriptor t_slot_desc;
- t_slot_desc.__set_slotType(TypeDescriptor(_columns[i].type).to_thrift());
+ if (_columns[i].type == TYPE_DECIMALV2) {
+ t_slot_desc.__set_slotType(TypeDescriptor::create_decimalv2_type(27, 9).to_thrift());
+ } else {
+ t_slot_desc.__set_slotType(TypeDescriptor(_columns[i].type).to_thrift());
+ }
t_slot_desc.__set_colName(_columns[i].name);
t_slot_desc.__set_columnPos(i);
t_slot_desc.__set_byteOffset(offset);
diff --git a/be/src/exprs/agg_fn_evaluator.cpp b/be/src/exprs/agg_fn_evaluator.cpp
index 232be0a..5e11f20 100644
--- a/be/src/exprs/agg_fn_evaluator.cpp
+++ b/be/src/exprs/agg_fn_evaluator.cpp
@@ -808,7 +808,7 @@ void AggFnEvaluator::choose_update_or_merge(FunctionContext* agg_fn_ctx, TupleRo
void AggFnEvaluator::serialize_or_finalize(FunctionContext* agg_fn_ctx, Tuple* src,
const SlotDescriptor* dst_slot_desc, Tuple* dst,
- void* fn) {
+ void* fn, bool add_null) {
// DCHECK_EQ(dst_slot_desc->type().type, _return_type.type);
if (src == NULL) {
src = dst;
@@ -818,7 +818,7 @@ void AggFnEvaluator::serialize_or_finalize(FunctionContext* agg_fn_ctx, Tuple* s
}
// same
- bool src_slot_null = src->is_null(_intermediate_slot_desc->null_indicator_offset());
+ bool src_slot_null = add_null || src->is_null(_intermediate_slot_desc->null_indicator_offset());
void* src_slot = NULL;
if (!src_slot_null) {
diff --git a/be/src/exprs/agg_fn_evaluator.h b/be/src/exprs/agg_fn_evaluator.h
index 83953a4..2ed950d 100644
--- a/be/src/exprs/agg_fn_evaluator.h
+++ b/be/src/exprs/agg_fn_evaluator.h
@@ -126,7 +126,7 @@ public:
// In the non-spilling case, this node would normally not merge.
void merge(FunctionContext* agg_fn_ctx, Tuple* src, Tuple* dst);
void serialize(FunctionContext* agg_fn_ctx, Tuple* dst);
- void finalize(FunctionContext* agg_fn_ctx, Tuple* src, Tuple* dst);
+ void finalize(FunctionContext* agg_fn_ctx, Tuple* src, Tuple* dst, bool add_null = false);
// TODO: implement codegen path. These functions would return IR functions with
// the same signature as the interpreted ones above.
@@ -167,7 +167,7 @@ public:
Tuple* dst);
static void finalize(const std::vector<AggFnEvaluator*>& evaluators,
const std::vector<doris_udf::FunctionContext*>& fn_ctxs, Tuple* src,
- Tuple* dst);
+ Tuple* dst, bool add_null = false);
static void init(const std::vector<AggFnEvaluator*>& evaluators,
const std::vector<doris_udf::FunctionContext*>& fn_ctxs, Tuple* dst);
static void serialize(const std::vector<AggFnEvaluator*>& evaluators,
@@ -260,7 +260,7 @@ private:
// taking TupleRow to the UDA signature taking AnvVals.
// void serialize_or_finalize(FunctionContext* agg_fn_ctx, const SlotDescriptor* dst_slot_desc, Tuple* dst, void* fn);
void serialize_or_finalize(FunctionContext* agg_fn_ctx, Tuple* src,
- const SlotDescriptor* dst_slot_desc, Tuple* dst, void* fn);
+ const SlotDescriptor* dst_slot_desc, Tuple* dst, void* fn, bool add_null = false);
// Writes the result in src into dst pointed to by _output_slot_desc
void set_output_slot(const doris_udf::AnyVal* src, const SlotDescriptor* dst_slot_desc,
@@ -280,8 +280,8 @@ inline void AggFnEvaluator::remove(doris_udf::FunctionContext* agg_fn_ctx, Tuple
}
inline void AggFnEvaluator::finalize(doris_udf::FunctionContext* agg_fn_ctx, Tuple* src,
- Tuple* dst) {
- serialize_or_finalize(agg_fn_ctx, src, _output_slot_desc, dst, _finalize_fn);
+ Tuple* dst, bool add_null) {
+ serialize_or_finalize(agg_fn_ctx, src, _output_slot_desc, dst, _finalize_fn, add_null);
}
inline void AggFnEvaluator::get_value(doris_udf::FunctionContext* agg_fn_ctx, Tuple* src,
Tuple* dst) {
@@ -335,11 +335,11 @@ inline void AggFnEvaluator::get_value(const std::vector<AggFnEvaluator*>& evalua
}
inline void AggFnEvaluator::finalize(const std::vector<AggFnEvaluator*>& evaluators,
const std::vector<doris_udf::FunctionContext*>& fn_ctxs,
- Tuple* src, Tuple* dst) {
+ Tuple* src, Tuple* dst, bool add_null) {
DCHECK_EQ(evaluators.size(), fn_ctxs.size());
for (int i = 0; i < evaluators.size(); ++i) {
- evaluators[i]->finalize(fn_ctxs[i], src, dst);
+ evaluators[i]->finalize(fn_ctxs[i], src, dst, add_null);
}
}
diff --git a/be/src/exprs/aggregate_functions.cpp b/be/src/exprs/aggregate_functions.cpp
index b5a8077..04b413e 100644
--- a/be/src/exprs/aggregate_functions.cpp
+++ b/be/src/exprs/aggregate_functions.cpp
@@ -58,6 +58,18 @@ void AggregateFunctions::init_null(FunctionContext*, AnyVal* dst) {
}
template <typename T>
+void AggregateFunctions::init_zero_not_null(FunctionContext*, T* dst) {
+ dst->is_null = false;
+ dst->val = 0;
+}
+
+template <>
+void AggregateFunctions::init_zero_not_null(FunctionContext*, DecimalV2Val* dst) {
+ dst->is_null = false;
+ dst->set_to_zero();
+}
+
+template <typename T>
void AggregateFunctions::init_zero(FunctionContext*, T* dst) {
dst->is_null = false;
dst->val = 0;
@@ -65,6 +77,19 @@ void AggregateFunctions::init_zero(FunctionContext*, T* dst) {
template <>
void AggregateFunctions::init_zero(FunctionContext*, DecimalV2Val* dst) {
+ dst->is_null = false;
+ dst->set_to_zero();
+}
+
+template <typename T>
+void AggregateFunctions::init_zero_null(FunctionContext*, T* dst) {
+ dst->is_null = true;
+ dst->val = 0;
+}
+
+template <>
+void AggregateFunctions::init_zero_null(FunctionContext*, DecimalV2Val* dst) {
+ dst->is_null = true;
dst->set_to_zero();
}
@@ -82,7 +107,7 @@ void AggregateFunctions::sum_remove(FunctionContext* ctx, const SRC_VAL& src, DS
return;
}
if (dst->is_null) {
- init_zero<DST_VAL>(ctx, dst);
+ init_zero_not_null<DST_VAL>(ctx, dst);
}
dst->val -= src.val;
}
@@ -98,7 +123,7 @@ void AggregateFunctions::sum_remove(FunctionContext* ctx, const DecimalV2Val& sr
return;
}
if (dst->is_null) {
- init_zero<DecimalV2Val>(ctx, dst);
+ init_zero_not_null<DecimalV2Val>(ctx, dst);
}
DecimalV2Value new_src = DecimalV2Value::from_decimal_val(src);
@@ -479,9 +504,8 @@ void AggregateFunctions::sum(FunctionContext* ctx, const SRC_VAL& src, DST_VAL*
}
if (dst->is_null) {
- init_zero<DST_VAL>(ctx, dst);
+ init_zero_not_null<DST_VAL>(ctx, dst);
}
-
dst->val += src.val;
}
@@ -517,6 +541,14 @@ void AggregateFunctions::sum(FunctionContext* ctx, const LargeIntVal& src, Large
}
template <typename T>
+void AggregateFunctions::min_init(FunctionContext* ctx, T* dst) {
+ auto val = AnyValUtil::max_val<T>(ctx);
+ // set to null when intermediate slot is nullable
+ val.is_null = true;
+ *dst = val;
+}
+
+template <typename T>
void AggregateFunctions::min(FunctionContext*, const T& src, T* dst) {
if (src.is_null) {
return;
@@ -528,6 +560,14 @@ void AggregateFunctions::min(FunctionContext*, const T& src, T* dst) {
}
template <typename T>
+void AggregateFunctions::max_init(FunctionContext* ctx, T* dst) {
+ auto val = AnyValUtil::min_val<T>(ctx);
+ // set to null when intermediate slot is nullable
+ val.is_null = true;
+ *dst = val;
+}
+
+template <typename T>
void AggregateFunctions::max(FunctionContext*, const T& src, T* dst) {
if (src.is_null) {
return;
@@ -723,7 +763,7 @@ void AggregateFunctions::string_concat_update(FunctionContext* ctx, const String
return;
}
const StringVal* sep = separator.is_null ? &DEFAULT_STRING_CONCAT_DELIM : &separator;
- if (result->is_null) {
+ if (result->is_null || !result->ptr) {
// Header of the intermediate state holds the length of the first separator.
const auto header_len = sizeof(StringConcatHeader);
DCHECK(header_len == sizeof(sep->len));
@@ -739,7 +779,7 @@ void AggregateFunctions::string_concat_merge(FunctionContext* ctx, const StringV
return;
}
const auto header_len = sizeof(StringConcatHeader);
- if (result->is_null) {
+ if (result->is_null || !result->ptr) {
// Copy the header from the first intermediate value.
*result = StringVal(ctx->allocate(header_len), header_len);
if (result->is_null) {
@@ -1900,8 +1940,7 @@ DoubleVal AggregateFunctions::knuth_var_finalize(FunctionContext* ctx, const Str
}
DecimalV2Val AggregateFunctions::decimalv2_knuth_var_finalize(FunctionContext* ctx,
- const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
+ const StringVal& state_sv) {
DCHECK_EQ(state_sv.len, sizeof(DecimalV2KnuthVarianceState));
DecimalV2KnuthVarianceState* state =
reinterpret_cast<DecimalV2KnuthVarianceState*>(state_sv.ptr);
@@ -1914,8 +1953,7 @@ DecimalV2Val AggregateFunctions::decimalv2_knuth_var_finalize(FunctionContext* c
}
DoubleVal AggregateFunctions::knuth_var_pop_finalize(FunctionContext* ctx,
- const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
+ const StringVal& state_sv) {
DCHECK_EQ(state_sv.len, sizeof(KnuthVarianceState));
KnuthVarianceState* state = reinterpret_cast<KnuthVarianceState*>(state_sv.ptr);
if (state->count == 0) return DoubleVal::null();
@@ -1925,8 +1963,7 @@ DoubleVal AggregateFunctions::knuth_var_pop_finalize(FunctionContext* ctx,
}
DecimalV2Val AggregateFunctions::decimalv2_knuth_var_pop_finalize(FunctionContext* ctx,
- const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
+ const StringVal& state_sv) {
DCHECK_EQ(state_sv.len, sizeof(DecimalV2KnuthVarianceState));
DecimalV2KnuthVarianceState* state =
reinterpret_cast<DecimalV2KnuthVarianceState*>(state_sv.ptr);
@@ -1940,7 +1977,6 @@ DecimalV2Val AggregateFunctions::decimalv2_knuth_var_pop_finalize(FunctionContex
DoubleVal AggregateFunctions::knuth_stddev_finalize(FunctionContext* ctx,
const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
DCHECK_EQ(state_sv.len, sizeof(KnuthVarianceState));
KnuthVarianceState* state = reinterpret_cast<KnuthVarianceState*>(state_sv.ptr);
if (state->count == 0 || state->count == 1) return DoubleVal::null();
@@ -1950,8 +1986,7 @@ DoubleVal AggregateFunctions::knuth_stddev_finalize(FunctionContext* ctx,
}
DecimalV2Val AggregateFunctions::decimalv2_knuth_stddev_finalize(FunctionContext* ctx,
- const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
+ const StringVal& state_sv) {
DCHECK_EQ(state_sv.len, sizeof(DecimalV2KnuthVarianceState));
DecimalV2KnuthVarianceState* state =
reinterpret_cast<DecimalV2KnuthVarianceState*>(state_sv.ptr);
@@ -1966,7 +2001,6 @@ DecimalV2Val AggregateFunctions::decimalv2_knuth_stddev_finalize(FunctionContext
DoubleVal AggregateFunctions::knuth_stddev_pop_finalize(FunctionContext* ctx,
const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
DCHECK_EQ(state_sv.len, sizeof(KnuthVarianceState));
KnuthVarianceState* state = reinterpret_cast<KnuthVarianceState*>(state_sv.ptr);
if (state->count == 0) return DoubleVal::null();
@@ -1976,8 +2010,7 @@ DoubleVal AggregateFunctions::knuth_stddev_pop_finalize(FunctionContext* ctx,
}
DecimalV2Val AggregateFunctions::decimalv2_knuth_stddev_pop_finalize(FunctionContext* ctx,
- const StringVal& state_sv) {
- DCHECK(!state_sv.is_null);
+ const StringVal& state_sv) {
DCHECK_EQ(state_sv.len, sizeof(DecimalV2KnuthVarianceState));
DecimalV2KnuthVarianceState* state =
reinterpret_cast<DecimalV2KnuthVarianceState*>(state_sv.ptr);
@@ -2201,7 +2234,18 @@ void AggregateFunctions::offset_fn_update(FunctionContext* ctx, const IntVal& sr
}
// Stamp out the templates for the types we need.
+template void AggregateFunctions::init_zero_null<BigIntVal>(FunctionContext*, BigIntVal* dst);
+template void AggregateFunctions::init_zero_null<LargeIntVal>(FunctionContext*, LargeIntVal* dst);
+template void AggregateFunctions::init_zero_null<DoubleVal>(FunctionContext*, DoubleVal* dst);
+template void AggregateFunctions::init_zero_null<DecimalV2Val>(FunctionContext*, DecimalV2Val* dst);
+
+// Stamp out the templates for the types we need.
template void AggregateFunctions::init_zero<BigIntVal>(FunctionContext*, BigIntVal* dst);
+template void AggregateFunctions::init_zero<LargeIntVal>(FunctionContext*, LargeIntVal* dst);
+template void AggregateFunctions::init_zero<DoubleVal>(FunctionContext*, DoubleVal* dst);
+template void AggregateFunctions::init_zero<DecimalV2Val>(FunctionContext*, DecimalV2Val* dst);
+
+template void AggregateFunctions::init_zero_not_null<BigIntVal>(FunctionContext*, BigIntVal* dst);
template void AggregateFunctions::sum_remove<BooleanVal, BigIntVal>(FunctionContext*,
const BooleanVal& src,
@@ -2278,6 +2322,18 @@ template void AggregateFunctions::sum<FloatVal, DoubleVal>(FunctionContext*, con
template void AggregateFunctions::sum<DoubleVal, DoubleVal>(FunctionContext*, const DoubleVal& src,
DoubleVal* dst);
+template void AggregateFunctions::min_init<BooleanVal>(doris_udf::FunctionContext *, BooleanVal* dst);
+template void AggregateFunctions::min_init<TinyIntVal>(doris_udf::FunctionContext *, TinyIntVal* dst);
+template void AggregateFunctions::min_init<SmallIntVal>(doris_udf::FunctionContext *, SmallIntVal* dst);
+template void AggregateFunctions::min_init<IntVal>(doris_udf::FunctionContext *, IntVal* dst);
+template void AggregateFunctions::min_init<BigIntVal>(doris_udf::FunctionContext *, BigIntVal* dst);
+template void AggregateFunctions::min_init<LargeIntVal>(doris_udf::FunctionContext *, LargeIntVal* dst);
+template void AggregateFunctions::min_init<FloatVal>(doris_udf::FunctionContext *, FloatVal* dst);
+template void AggregateFunctions::min_init<DoubleVal>(doris_udf::FunctionContext *, DoubleVal* dst);
+template void AggregateFunctions::min_init<DateTimeVal>(doris_udf::FunctionContext *, DateTimeVal* dst);
+template void AggregateFunctions::min_init<DecimalV2Val>(doris_udf::FunctionContext *, DecimalV2Val* dst);
+template void AggregateFunctions::min_init<StringVal>(doris_udf::FunctionContext *, StringVal* dst);
+
template void AggregateFunctions::min<BooleanVal>(FunctionContext*, const BooleanVal& src,
BooleanVal* dst);
template void AggregateFunctions::min<TinyIntVal>(FunctionContext*, const TinyIntVal& src,
@@ -2310,6 +2366,18 @@ template void AggregateFunctions::avg_remove<doris_udf::SmallIntVal>(doris_udf::
doris_udf::SmallIntVal const&,
doris_udf::StringVal*);
+template void AggregateFunctions::max_init<BooleanVal>(doris_udf::FunctionContext *, BooleanVal* dst);
+template void AggregateFunctions::max_init<TinyIntVal>(doris_udf::FunctionContext *, TinyIntVal* dst);
+template void AggregateFunctions::max_init<SmallIntVal>(doris_udf::FunctionContext *, SmallIntVal* dst);
+template void AggregateFunctions::max_init<IntVal>(doris_udf::FunctionContext *, IntVal* dst);
+template void AggregateFunctions::max_init<BigIntVal>(doris_udf::FunctionContext *, BigIntVal* dst);
+template void AggregateFunctions::max_init<LargeIntVal>(doris_udf::FunctionContext *, LargeIntVal* dst);
+template void AggregateFunctions::max_init<FloatVal>(doris_udf::FunctionContext *, FloatVal* dst);
+template void AggregateFunctions::max_init<DoubleVal>(doris_udf::FunctionContext *, DoubleVal* dst);
+template void AggregateFunctions::max_init<DateTimeVal>(doris_udf::FunctionContext *, DateTimeVal* dst);
+template void AggregateFunctions::max_init<DecimalV2Val>(doris_udf::FunctionContext *, DecimalV2Val* dst);
+template void AggregateFunctions::max_init<StringVal>(doris_udf::FunctionContext *, StringVal* dst);
+
template void AggregateFunctions::max<BooleanVal>(FunctionContext*, const BooleanVal& src,
BooleanVal* dst);
template void AggregateFunctions::max<TinyIntVal>(FunctionContext*, const TinyIntVal& src,
diff --git a/be/src/exprs/aggregate_functions.h b/be/src/exprs/aggregate_functions.h
index 39e9aa8..638662b 100644
--- a/be/src/exprs/aggregate_functions.h
+++ b/be/src/exprs/aggregate_functions.h
@@ -41,10 +41,19 @@ public:
// Initializes dst to NULL and sets dst->ptr to NULL.
static void init_null_string(doris_udf::FunctionContext* c, doris_udf::StringVal* dst);
- // Initializes dst to 0.
+ // Initializes dst to 0 and is_null = true.
template <typename T>
static void init_zero(doris_udf::FunctionContext*, T* dst);
+ // Initializes dst to 0 and is_null = true.
+ template <typename T>
+ static void init_zero_null(doris_udf::FunctionContext*, T* dst);
+
+ // Initializes dst to 0.
+ template <typename T>
+ static void init_zero_not_null(doris_udf::FunctionContext*, T* dst);
+
+
template <typename SRC_VAL, typename DST_VAL>
static void sum_remove(doris_udf::FunctionContext* ctx, const SRC_VAL& src, DST_VAL* dst);
@@ -127,10 +136,18 @@ public:
template <typename SRC_VAL, typename DST_VAL>
static void sum(doris_udf::FunctionContext*, const SRC_VAL& src, DST_VAL* dst);
+ // MinInit
+ template <typename T>
+ static void min_init(doris_udf::FunctionContext*, T* dst);
+
// MinUpdate/MinMerge
template <typename T>
static void min(doris_udf::FunctionContext*, const T& src, T* dst);
+ // MaxInit
+ template <typename T>
+ static void max_init(doris_udf::FunctionContext*, T* dst);
+
// MaxUpdate/MaxMerge
template <typename T>
static void max(doris_udf::FunctionContext*, const T& src, T* dst);
diff --git a/be/src/exprs/anyval_util.h b/be/src/exprs/anyval_util.h
index 4775539..d465c12 100644
--- a/be/src/exprs/anyval_util.h
+++ b/be/src/exprs/anyval_util.h
@@ -22,6 +22,7 @@
#include "exprs/expr.h"
#include "runtime/collection_value.h"
#include "runtime/primitive_type.h"
+#include "runtime/type_limit.h"
#include "udf/udf.h"
#include "util/hash_util.hpp"
#include "util/types.h"
@@ -168,6 +169,45 @@ public:
return HashUtil::murmur_hash64A(&v.val, 8, seed);
}
+ template <typename Val>
+ static Val min_val(FunctionContext* ctx) {
+ if constexpr (std::is_same_v<Val, StringVal>) {
+ return StringVal();
+ } else if constexpr (std::is_same_v<Val, DateTimeVal>) {
+ DateTimeVal val;
+ type_limit<DateTimeValue>::min().to_datetime_val(&val);
+ return val;
+ } else if constexpr (std::is_same_v<Val, DecimalV2Val>) {
+ DecimalV2Val val;
+ type_limit<DecimalV2Value>::min().to_decimal_val(&val);
+ return val;
+ } else {
+ return Val(type_limit<decltype(std::declval<Val>().val)>::min());
+ }
+ }
+
+ template <typename Val>
+ static Val max_val(FunctionContext* ctx) {
+ if constexpr (std::is_same_v<Val, StringVal>) {
+ StringValue sv = type_limit<StringValue>::max();
+ StringVal max_val;
+ max_val.ptr = ctx->allocate(sv.len);
+ memcpy(max_val.ptr, sv.ptr, sv.len);
+
+ return max_val;
+ } else if constexpr (std::is_same_v<Val, DateTimeVal>) {
+ DateTimeVal val;
+ type_limit<DateTimeValue>::max().to_datetime_val(&val);
+ return val;
+ } else if constexpr (std::is_same_v<Val, DecimalV2Val>) {
+ DecimalV2Val val;
+ type_limit<DecimalV2Value>::max().to_decimal_val(&val);
+ return val;
+ } else {
+ return Val(type_limit<decltype(std::declval<Val>().val)>::max());
+ }
+ }
+
// Returns the byte size of *Val for type t.
static int any_val_size(const TypeDescriptor& t) {
switch (t.type) {
diff --git a/be/src/exprs/expr_value.h b/be/src/exprs/expr_value.h
index bb98c49..f55a6d6 100644
--- a/be/src/exprs/expr_value.h
+++ b/be/src/exprs/expr_value.h
@@ -175,11 +175,11 @@ struct ExprValue {
return &large_int_val;
case TYPE_FLOAT:
- float_val = std::numeric_limits<float>::min();
+ float_val = std::numeric_limits<float>::lowest();
return &float_val;
case TYPE_DOUBLE:
- double_val = std::numeric_limits<double>::min();
+ double_val = std::numeric_limits<double>::lowest();
return &double_val;
case TYPE_DECIMALV2:
diff --git a/be/src/exprs/hll_function.cpp b/be/src/exprs/hll_function.cpp
index fe33c11..af8b3e1 100644
--- a/be/src/exprs/hll_function.cpp
+++ b/be/src/exprs/hll_function.cpp
@@ -29,6 +29,10 @@ using doris_udf::StringVal;
void HllFunctions::init() {}
StringVal HllFunctions::hll_hash(FunctionContext* ctx, const StringVal& input) {
+ return AnyValUtil::from_string_temp(ctx, hll_hash(input));
+}
+
+std::string HllFunctions::hll_hash(const StringVal& input) {
HyperLogLog hll;
if (!input.is_null) {
uint64_t hash_value = HashUtil::murmur_hash64A(input.ptr, input.len, HashUtil::MURMUR_SEED);
@@ -37,7 +41,8 @@ StringVal HllFunctions::hll_hash(FunctionContext* ctx, const StringVal& input) {
std::string buf;
buf.resize(hll.max_serialized_size());
buf.resize(hll.serialize((uint8_t*)buf.c_str()));
- return AnyValUtil::from_string_temp(ctx, buf);
+
+ return buf;
}
void HllFunctions::hll_init(FunctionContext*, StringVal* dst) {
@@ -45,6 +50,7 @@ void HllFunctions::hll_init(FunctionContext*, StringVal* dst) {
dst->len = sizeof(HyperLogLog);
dst->ptr = (uint8_t*)new HyperLogLog();
}
+
StringVal HllFunctions::hll_empty(FunctionContext* ctx) {
return AnyValUtil::from_string_temp(ctx, HyperLogLog::empty());
}
diff --git a/be/src/exprs/hll_function.h b/be/src/exprs/hll_function.h
index b1d8e2c..a8f7ab0 100644
--- a/be/src/exprs/hll_function.h
+++ b/be/src/exprs/hll_function.h
@@ -18,6 +18,7 @@
#ifndef DORIS_BE_SRC_QUERY_EXPRS_HLL_FUNCTION_H
#define DORIS_BE_SRC_QUERY_EXPRS_HLL_FUNCTION_H
+#include <string>
#include "udf/udf.h"
namespace doris {
@@ -26,6 +27,8 @@ class HllFunctions {
public:
static void init();
static StringVal hll_hash(FunctionContext* ctx, const StringVal& dest_base);
+ static std::string hll_hash(const StringVal& dest_base);
+
static StringVal hll_empty(FunctionContext* ctx);
static void hll_init(FunctionContext*, StringVal* dst);
diff --git a/be/src/exprs/hybrid_set.h b/be/src/exprs/hybrid_set.h
index 495232f..47c02ea 100644
--- a/be/src/exprs/hybrid_set.h
+++ b/be/src/exprs/hybrid_set.h
@@ -187,4 +187,4 @@ private:
} // namespace doris
-#endif // DORIS_BE_SRC_QUERY_EXPRS_HYBRID_SET_H
\ No newline at end of file
+#endif // DORIS_BE_SRC_QUERY_EXPRS_HYBRID_SET_H
diff --git a/be/src/exprs/new_agg_fn_evaluator.cc b/be/src/exprs/new_agg_fn_evaluator.cc
index 8286732..0d192d0 100644
--- a/be/src/exprs/new_agg_fn_evaluator.cc
+++ b/be/src/exprs/new_agg_fn_evaluator.cc
@@ -229,7 +229,7 @@ void NewAggFnEvaluator::Close(const vector<NewAggFnEvaluator*>& evals, RuntimeSt
void NewAggFnEvaluator::SetDstSlot(const AnyVal* src, const SlotDescriptor& dst_slot_desc,
Tuple* dst) {
- if (src->is_null) {
+ if (src->is_null && dst_slot_desc.is_nullable()) {
dst->set_null(dst_slot_desc.null_indicator_offset());
return;
}
@@ -531,14 +531,14 @@ void NewAggFnEvaluator::Merge(Tuple* src, Tuple* dst) {
}
void NewAggFnEvaluator::SerializeOrFinalize(Tuple* src, const SlotDescriptor& dst_slot_desc,
- Tuple* dst, void* fn) {
+ Tuple* dst, void* fn, bool add_null) {
// No fn was given and the src and dst are identical. Nothing to be done.
if (fn == nullptr && src == dst) return;
// src != dst means we are performing a Finalize(), so even if fn == null we
// still must copy the value of the src slot into dst.
const SlotDescriptor& slot_desc = intermediate_slot_desc();
- bool src_slot_null = src->is_null(slot_desc.null_indicator_offset());
+ bool src_slot_null = add_null || src->is_null(slot_desc.null_indicator_offset());
void* src_slot = nullptr;
if (!src_slot_null) src_slot = src->get_slot(slot_desc.tuple_offset());
diff --git a/be/src/exprs/new_agg_fn_evaluator.h b/be/src/exprs/new_agg_fn_evaluator.h
index f1c13e4..a03626e 100644
--- a/be/src/exprs/new_agg_fn_evaluator.h
+++ b/be/src/exprs/new_agg_fn_evaluator.h
@@ -138,7 +138,7 @@ public:
/// Does one final transformation of the aggregated value in 'agg_val' and stores the
/// result in 'output_val'. Also frees the resources allocated during init, update and
/// merge phases.
- void Finalize(Tuple* agg_val, Tuple* output_val);
+ void Finalize(Tuple* agg_val, Tuple* output_val, bool add_null = false);
/// Puts the finalized value from Tuple* src in Tuple* dst just as Finalize() does.
/// However, unlike Finalize(), GetValue() does not clean up state in src.
@@ -180,7 +180,7 @@ public:
Tuple* dst);
static void Serialize(const std::vector<NewAggFnEvaluator*>& evals, Tuple* dst);
static void GetValue(const std::vector<NewAggFnEvaluator*>& evals, Tuple* src, Tuple* dst);
- static void Finalize(const std::vector<NewAggFnEvaluator*>& evals, Tuple* src, Tuple* dst);
+ static void Finalize(const std::vector<NewAggFnEvaluator*>& evals, Tuple* src, Tuple* dst, bool add_null = false);
/// Free local allocations made in UDA functions and input arguments' evals.
//void FreeLocalAllocations();
@@ -250,6 +250,10 @@ private:
/// generated by AggFn::CodegenUpdateOrMergeFunction() when codegen is enabled.
void Update(const TupleRow* row, Tuple* dst, void* fn);
+ /// Writes the result in src into dst pointed to by dst_slot_desc
+ inline void SetDstSlot(const doris_udf::AnyVal* src, const SlotDescriptor& dst_slot_desc,
+ Tuple* dst);
+
/// Sets up the arguments to call 'fn'. This converts from the agg-expr signature,
/// taking TupleRow to the UDA signature taking AnyVals. Writes the serialize/finalize
/// result to the given destination slot/tuple. 'fn' can be NULL to indicate the src
@@ -257,11 +261,7 @@ private:
/// from local allocation (which will be freed in the next QueryMaintenance()) so it
/// needs to be copied out if it needs to survive beyond QueryMaintenance() (e.g. if
/// 'dst' lives in a row batch).
- void SerializeOrFinalize(Tuple* src, const SlotDescriptor& dst_slot_desc, Tuple* dst, void* fn);
-
- /// Writes the result in src into dst pointed to by dst_slot_desc
- inline void SetDstSlot(const doris_udf::AnyVal* src, const SlotDescriptor& dst_slot_desc,
- Tuple* dst);
+ void SerializeOrFinalize(Tuple* src, const SlotDescriptor& dst_slot_desc, Tuple* dst, void* fn, bool add_null = false);
// Sets 'dst' to the value from 'slot'.
void set_any_val(const void* slot, const TypeDescriptor& type, doris_udf::AnyVal* dst);
@@ -281,8 +281,8 @@ inline void NewAggFnEvaluator::Serialize(Tuple* tuple) {
SerializeOrFinalize(tuple, agg_fn_.intermediate_slot_desc(), tuple, agg_fn_.serialize_fn());
}
-inline void NewAggFnEvaluator::Finalize(Tuple* agg_val, Tuple* output_val) {
- SerializeOrFinalize(agg_val, agg_fn_.output_slot_desc(), output_val, agg_fn_.finalize_fn());
+inline void NewAggFnEvaluator::Finalize(Tuple* agg_val, Tuple* output_val, bool add_null) {
+ SerializeOrFinalize(agg_val, agg_fn_.output_slot_desc(), output_val, agg_fn_.finalize_fn(), add_null);
}
inline void NewAggFnEvaluator::GetValue(Tuple* src, Tuple* dst) {
@@ -313,9 +313,9 @@ inline void NewAggFnEvaluator::GetValue(const std::vector<NewAggFnEvaluator*>& e
}
inline void NewAggFnEvaluator::Finalize(const std::vector<NewAggFnEvaluator*>& evals,
- Tuple* agg_val, Tuple* output_val) {
+ Tuple* agg_val, Tuple* output_val, bool add_null) {
for (int i = 0; i < evals.size(); ++i) {
- evals[i]->Finalize(agg_val, output_val);
+ evals[i]->Finalize(agg_val, output_val, add_null);
}
}
diff --git a/be/src/exprs/timestamp_functions.cpp b/be/src/exprs/timestamp_functions.cpp
index a951bb8..610187a 100644
--- a/be/src/exprs/timestamp_functions.cpp
+++ b/be/src/exprs/timestamp_functions.cpp
@@ -62,6 +62,29 @@ bool TimestampFunctions::check_format(const StringVal& format, DateTimeValue& t)
return false;
}
+std::string TimestampFunctions::convert_format(const std::string& format) {
+ switch (format.size()) {
+ case 8:
+ if (strncmp(format.c_str(), "yyyyMMdd", 8) == 0) {
+ return std::string("%Y%m%d");
+ }
+ break;
+ case 10:
+ if (strncmp(format.c_str(), "yyyy-MM-dd", 10) == 0) {
+ return std::string("%Y-%m-%d");
+ }
+ break;
+ case 19:
+ if (strncmp(format.c_str(), "yyyy-MM-dd HH:mm:ss", 19) == 0) {
+ return std::string("%Y-%m-%d %H:%i:%s");
+ }
+ break;
+ default:
+ break;
+ }
+ return format;
+}
+
StringVal TimestampFunctions::convert_format(FunctionContext* ctx, const StringVal& format) {
switch (format.len) {
case 8:
@@ -438,61 +461,7 @@ BigIntVal TimestampFunctions::timestamp_diff(FunctionContext* ctx, const DateTim
DateTimeValue ts_value1 = DateTimeValue::from_datetime_val(ts_val1);
DateTimeValue ts_value2 = DateTimeValue::from_datetime_val(ts_val2);
- switch (unit) {
- case YEAR: {
- int year = (ts_value2.year() - ts_value1.year());
- if (year > 0) {
- year -= (ts_value2.to_int64() % 10000000000 - ts_value1.to_int64() % 10000000000) < 0;
- } else if (year < 0) {
- year += (ts_value2.to_int64() % 10000000000 - ts_value1.to_int64() % 10000000000) > 0;
- }
- return year;
- }
- case MONTH: {
- int month = (ts_value2.year() - ts_value1.year()) * 12 +
- (ts_value2.month() - ts_value1.month());
- if (month > 0) {
- month -= (ts_value2.to_int64() % 100000000 - ts_value1.to_int64() % 100000000) < 0;
- } else if (month < 0) {
- month += (ts_value2.to_int64() % 100000000 - ts_value1.to_int64() % 100000000) > 0;
- }
- return month;
- }
- case WEEK: {
- int day = ts_value2.daynr() - ts_value1.daynr();
- if (day > 0) {
- day -= ts_value2.time_part_diff(ts_value1) < 0;
- } else if (day < 0) {
- day += ts_value2.time_part_diff(ts_value1) > 0;
- }
- return day / 7;
- }
- case DAY: {
- int day = ts_value2.daynr() - ts_value1.daynr();
- if (day > 0) {
- day -= ts_value2.time_part_diff(ts_value1) < 0;
- } else if (day < 0) {
- day += ts_value2.time_part_diff(ts_value1) > 0;
- }
- return day;
- }
- case HOUR: {
- int64_t second = ts_value2.second_diff(ts_value1);
- int64_t hour = second / 60 / 60;
- return hour;
- }
- case MINUTE: {
- int64_t second = ts_value2.second_diff(ts_value1);
- int64_t minute = second / 60;
- return minute;
- }
- case SECOND: {
- int64_t second = ts_value2.second_diff(ts_value1);
- return second;
- }
- default:
- return BigIntVal::null();
- }
+ return DateTimeValue::datetime_diff<unit>(ts_value1, ts_value2);
}
void TimestampFunctions::format_prepare(doris_udf::FunctionContext* context,
@@ -575,10 +544,10 @@ DateTimeVal from_olap_datetime(uint64_t datetime) {
static const DateTimeVal FIRST_DAY = from_olap_datetime(19700101000000);
static const DateTimeVal FIRST_SUNDAY = from_olap_datetime(19700104000000);
-#define TIME_ROUND(UNIT, unit, ORIGIN) \
- _TR_4(FLOOR, floor, UNIT, unit) \
- _TR_4(CEIL, ceil, UNIT, unit) _TR_5(FLOOR, floor, UNIT, unit, ORIGIN) \
- _TR_5(CEIL, ceil, UNIT, unit, ORIGIN)
+#define TIME_ROUND(UNIT, unit, ORIGIN) \
+ _TR_4(FLOOR, floor, UNIT, unit) \
+ _TR_4(CEIL, ceil, UNIT, unit) \
+ _TR_5(FLOOR, floor, UNIT, unit, ORIGIN) _TR_5(CEIL, ceil, UNIT, unit, ORIGIN)
TIME_ROUND(YEAR, year, FIRST_DAY)
TIME_ROUND(MONTH, month, FIRST_DAY)
diff --git a/be/src/exprs/timestamp_functions.h b/be/src/exprs/timestamp_functions.h
index 17f38f6..155837c 100644
--- a/be/src/exprs/timestamp_functions.h
+++ b/be/src/exprs/timestamp_functions.h
@@ -420,6 +420,8 @@ public:
// Todo(kks): remove this method when 0.12 release
static StringVal convert_format(doris_udf::FunctionContext* ctx, const StringVal& format);
+ static std::string convert_format(const std::string& format);
+
// Issue a warning for a bad format string.
static void report_bad_format(const StringVal* format);
diff --git a/be/src/olap/block_column_predicate.h b/be/src/olap/block_column_predicate.h
index d20408b..4c06486 100644
--- a/be/src/olap/block_column_predicate.h
+++ b/be/src/olap/block_column_predicate.h
@@ -25,7 +25,7 @@
namespace doris {
// Block Column Predicate support do column predicate in RowBlockV2 and support OR and AND predicate
-// Block Column Predicate will replace column predicate as a unified external vectorization interface
+// Block Column Predicate will replace column predicate as a unified external vectorized interface
// in the future
// TODO: support do predicate on Bitmap and ZoneMap, So we can use index of column to do predicate on
// page and segment
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index e2d4b1d..f39eaa0 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -526,7 +526,7 @@ Status SegmentIterator::next_batch(RowBlockV2* block) {
_opts.stats->raw_rows_read += nrows_read;
_opts.stats->blocks_load += 1;
- // phase 2: run vectorization evaluation on remaining predicates to prune rows.
+ // phase 2: run vectorized evaluation on remaining predicates to prune rows.
// block's selection vector will be set to indicate which rows have passed predicates.
// TODO(hkp): optimize column predicate to check column block once for one column
if (!_col_predicates.empty() || _opts.delete_condition_predicates.get() != nullptr) {
diff --git a/be/src/runtime/data_stream_recvr.cc b/be/src/runtime/data_stream_recvr.cc
index cba524e..b836253 100644
--- a/be/src/runtime/data_stream_recvr.cc
+++ b/be/src/runtime/data_stream_recvr.cc
@@ -461,8 +461,6 @@ DataStreamRecvr::DataStreamRecvr(
// Initialize the counters
_bytes_received_counter = ADD_COUNTER(_profile, "BytesReceived", TUnit::BYTES);
- // _bytes_received_time_series_counter =
- // ADD_TIME_SERIES_COUNTER(_profile, "BytesReceived", _bytes_received_counter);
_deserialize_row_batch_timer = ADD_TIMER(_profile, "DeserializeRowBatchTimer");
_data_arrival_timer = ADD_TIMER(_profile, "DataArrivalWaitTime");
_buffer_full_total_timer = ADD_TIMER(_profile, "SendersBlockedTotalTimer(*)");
diff --git a/be/src/runtime/data_stream_sender.cpp b/be/src/runtime/data_stream_sender.cpp
index 436a017..777d6da 100644
--- a/be/src/runtime/data_stream_sender.cpp
+++ b/be/src/runtime/data_stream_sender.cpp
@@ -420,6 +420,7 @@ DataStreamSender::DataStreamSender(ObjectPool* pool, int sender_id, const RowDes
// We use the ParttitionRange to compare here. It should not be a member function of PartitionInfo
// class becaurce there are some other member in it.
+// TODO: move this to dpp_sink
static bool compare_part_use_range(const PartitionInfo* v1, const PartitionInfo* v2) {
return v1->range() < v2->range();
}
@@ -472,8 +473,9 @@ Status DataStreamSender::prepare(RuntimeState* state) {
<< "])";
_profile = _pool->add(new RuntimeProfile(title.str()));
SCOPED_TIMER(_profile->total_time_counter());
- _mem_tracker = MemTracker::CreateTracker(_profile, -1, "DataStreamSender",
- state->instance_mem_tracker());
+ _mem_tracker = MemTracker::CreateTracker(
+ _profile, -1, "DataStreamSender:" + print_id(state->fragment_instance_id()),
+ state->instance_mem_tracker());
if (_part_type == TPartitionType::UNPARTITIONED || _part_type == TPartitionType::RANDOM) {
// Randomize the order we open/transmit to channels to avoid thundering herd problems.
diff --git a/be/src/runtime/datetime_value.cpp b/be/src/runtime/datetime_value.cpp
index 49b84b3..183c604 100644
--- a/be/src/runtime/datetime_value.cpp
+++ b/be/src/runtime/datetime_value.cpp
@@ -28,19 +28,15 @@
#include "util/timezone_utils.h"
namespace doris {
-
const uint64_t log_10_int[] = {1, 10, 100, 1000,
10000UL, 100000UL, 1000000UL, 10000000UL,
100000000UL, 1000000000UL, 10000000000UL, 100000000000UL};
static int s_days_in_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-static const char* s_month_name[] = {"", "January", "February", "March", "April",
- "May", "June", "July", "August", "September",
- "October", "November", "December", NULL};
+
static const char* s_ab_month_name[] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL};
-static const char* s_day_name[] = {"Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday", "Sunday", NULL};
+
static const char* s_ab_day_name[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", NULL};
uint8_t mysql_week_mode(uint32_t mode) {
@@ -1150,7 +1146,7 @@ bool DateTimeValue::from_date_format_str(const char* format, int format_len, con
date_part_used = true;
break;
case 'M':
- int_value = check_word(s_month_name, val, val_end, &val);
+ int_value = check_word(const_cast<const char**>(s_month_name), val, val_end, &val);
if (int_value < 0) {
return false;
}
@@ -1245,7 +1241,7 @@ bool DateTimeValue::from_date_format_str(const char* format, int format_len, con
break;
// Weekday
case 'W':
- int_value = check_word(s_day_name, val, val_end, &val);
+ int_value = check_word(const_cast<const char**>(s_day_name), val, val_end, &val);
if (int_value < 0) {
return false;
}
diff --git a/be/src/runtime/datetime_value.h b/be/src/runtime/datetime_value.h
index 033828d..8f5e7fd 100644
--- a/be/src/runtime/datetime_value.h
+++ b/be/src/runtime/datetime_value.h
@@ -137,6 +137,28 @@ const int TIME_MAX_SECOND = 59;
const int TIME_MAX_VALUE = 10000 * TIME_MAX_HOUR + 100 * TIME_MAX_MINUTE + TIME_MAX_SECOND;
const int TIME_MAX_VALUE_SECONDS = 3600 * TIME_MAX_HOUR + 60 * TIME_MAX_MINUTE + TIME_MAX_SECOND;
+constexpr size_t const_length(const char* str) {
+ return (str == nullptr || *str == 0) ? 0 : const_length(str + 1) + 1;
+}
+
+constexpr size_t max_char_length(const char* const* name, size_t end) {
+ size_t res = 0;
+ for (int i = 0; i < end; ++i) {
+ res = std::max(const_length(name[i]), res);
+ }
+ return res;
+}
+
+static constexpr const char* s_month_name[] = {
+ "", "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December", NULL};
+
+static constexpr const char* s_day_name[] = {"Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday", "Sunday", NULL};
+
+static constexpr size_t MAX_DAY_NAME_LEN = max_char_length(s_day_name, std::size(s_day_name));
+static constexpr size_t MAX_MONTH_NAME_LEN = max_char_length(s_month_name, std::size(s_month_name));
+
uint8_t mysql_week_mode(uint32_t mode);
class DateTimeValue {
@@ -145,15 +167,15 @@ public:
DateTimeValue()
: _neg(0),
_type(TIME_DATETIME),
- _hour(0),
- _minute(0),
_second(0),
- _year(0),
- _month(0),
+ _minute(0),
+ _hour(0),
_day(0),
+ _month(0),
+ _year(0),
_microsecond(0) {}
- DateTimeValue(int64_t t) { from_date_int64(t); }
+ explicit DateTimeValue(int64_t t) { from_date_int64(t); }
void set_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour,
uint32_t minute, uint32_t second, uint32_t microsecond);
@@ -255,6 +277,68 @@ public:
static bool check_date(uint32_t year, uint32_t month, uint32_t day);
+ // compute the diff between two datetime value
+ template <TimeUnit unit>
+ static int64_t datetime_diff(const DateTimeValue& ts_value1, const DateTimeValue& ts_value2) {
+ switch (unit) {
+ case YEAR: {
+ int year = (ts_value2.year() - ts_value1.year());
+ if (year > 0) {
+ year -= (ts_value2.to_int64() % 10000000000 - ts_value1.to_int64() % 10000000000) <
+ 0;
+ } else if (year < 0) {
+ year += (ts_value2.to_int64() % 10000000000 - ts_value1.to_int64() % 10000000000) >
+ 0;
+ }
+ return year;
+ }
+ case MONTH: {
+ int month = (ts_value2.year() - ts_value1.year()) * 12 +
+ (ts_value2.month() - ts_value1.month());
+ if (month > 0) {
+ month -= (ts_value2.to_int64() % 100000000 - ts_value1.to_int64() % 100000000) < 0;
+ } else if (month < 0) {
+ month += (ts_value2.to_int64() % 100000000 - ts_value1.to_int64() % 100000000) > 0;
+ }
+ return month;
+ }
+ case WEEK: {
+ int day = ts_value2.daynr() - ts_value1.daynr();
+ if (day > 0) {
+ day -= ts_value2.time_part_diff(ts_value1) < 0;
+ } else if (day < 0) {
+ day += ts_value2.time_part_diff(ts_value1) > 0;
+ }
+ return day / 7;
+ }
+ case DAY: {
+ int day = ts_value2.daynr() - ts_value1.daynr();
+ if (day > 0) {
+ day -= ts_value2.time_part_diff(ts_value1) < 0;
+ } else if (day < 0) {
+ day += ts_value2.time_part_diff(ts_value1) > 0;
+ }
+ return day;
+ }
+ case HOUR: {
+ int64_t second = ts_value2.second_diff(ts_value1);
+ int64_t hour = second / 60 / 60;
+ return hour;
+ }
+ case MINUTE: {
+ int64_t second = ts_value2.second_diff(ts_value1);
+ int64_t minute = second / 60;
+ return minute;
+ }
+ case SECOND: {
+ int64_t second = ts_value2.second_diff(ts_value1);
+ return second;
+ }
+ }
+ // Rethink the default return value
+ return 0;
+ }
+
// Convert this value to uint64_t
// Will check its type
int64_t to_int64() const;
@@ -278,11 +362,13 @@ public:
int year() const { return _year; }
int month() const { return _month; }
+ int quarter() const { return (_month - 1) / 3 + 1; }
int day() const { return _day; }
int hour() const { return _hour; }
int minute() const { return _minute; }
int second() const { return _second; }
int microsecond() const { return _microsecond; }
+ int neg() const { return _neg; }
bool check_loss_accuracy_cast_to_date() {
auto loss_accuracy = _hour != 0 || _minute != 0 || _second != 0 || _microsecond != 0;
@@ -309,6 +395,7 @@ public:
// Weekday, from 0(Mon) to 6(Sun)
inline uint8_t weekday() const { return calc_weekday(daynr(), false); }
+ inline auto day_of_week() const { return (weekday() + 1) % 7 + 1; }
// The bits in week_format has the following meaning:
// WEEK_MONDAY_FIRST (0)
@@ -536,15 +623,15 @@ private:
bool from_date_format_str(const char* format, int format_len, const char* value, int value_len,
const char** sub_val_end);
- // 1 bits for neg. 3 bits for type. 12bit for hour
+ // 1 bits for neg. 3 bits for type. 12bit for second
uint16_t _neg : 1; // Used for time value.
uint16_t _type : 3; // Which type of this value.
- uint16_t _hour : 12;
+ uint16_t _second : 12;
uint8_t _minute;
- uint8_t _second;
- uint16_t _year;
- uint8_t _month;
+ uint8_t _hour;
uint8_t _day;
+ uint8_t _month;
+ uint16_t _year;
// TODO(zc): used for nothing
uint64_t _microsecond;
@@ -552,12 +639,12 @@ private:
uint32_t microsecond, uint16_t year, uint8_t month, uint8_t day)
: _neg(neg),
_type(type),
- _hour(hour),
- _minute(minute),
_second(second),
- _year(year),
- _month(month),
+ _minute(minute),
+ _hour(hour),
_day(day),
+ _month(month),
+ _year(year),
_microsecond(microsecond) {}
// RE2 obj is thread safe
diff --git a/be/src/runtime/descriptors.cpp b/be/src/runtime/descriptors.cpp
index f6f7b2a..9b3a28e 100644
--- a/be/src/runtime/descriptors.cpp
+++ b/be/src/runtime/descriptors.cpp
@@ -280,10 +280,12 @@ RowDescriptor::RowDescriptor(const DescriptorTbl& desc_tbl, const std::vector<TT
: _tuple_idx_nullable_map(nullable_tuples) {
DCHECK(nullable_tuples.size() == row_tuples.size());
DCHECK_GT(row_tuples.size(), 0);
+ _num_materialized_slots = 0;
_num_null_slots = 0;
for (int i = 0; i < row_tuples.size(); ++i) {
TupleDescriptor* tupleDesc = desc_tbl.get_tuple_descriptor(row_tuples[i]);
+ _num_materialized_slots += tupleDesc->num_materialized_slots();
_num_null_slots += tupleDesc->num_null_slots();
_tuple_desc_map.push_back(tupleDesc);
DCHECK(_tuple_desc_map.back() != NULL);
@@ -459,6 +461,20 @@ std::string RowDescriptor::debug_string() const {
return ss.str();
}
+
+int RowDescriptor::get_column_id(int slot_id) const {
+ int column_id_counter = 0;
+ for(const auto tuple_desc:_tuple_desc_map) {
+ for(const auto slot:tuple_desc->slots()) {
+ if(slot->id() == slot_id) {
+ return column_id_counter;
+ }
+ column_id_counter++;
+ }
+ }
+ return -1;
+}
+
Status DescriptorTbl::create(ObjectPool* pool, const TDescriptorTable& thrift_tbl,
DescriptorTbl** tbl) {
*tbl = pool->add(new DescriptorTbl());
diff --git a/be/src/runtime/descriptors.h b/be/src/runtime/descriptors.h
index a98451b..e201d84 100644
--- a/be/src/runtime/descriptors.h
+++ b/be/src/runtime/descriptors.h
@@ -32,6 +32,10 @@
#include "gen_cpp/Types_types.h"
#include "runtime/types.h"
+namespace doris::vectorized {
+class ColumnWithTypeAndName;
+}
+
namespace doris {
class ObjectPool;
@@ -241,6 +245,7 @@ class TupleDescriptor {
public:
// virtual ~TupleDescriptor() {}
int byte_size() const { return _byte_size; }
+ int num_materialized_slots() const { return _num_materialized_slots; }
int num_null_slots() const { return _num_null_slots; }
int num_null_bytes() const { return _num_null_bytes; }
const std::vector<SlotDescriptor*>& slots() const { return _slots; }
@@ -351,9 +356,11 @@ public:
_tuple_idx_nullable_map(desc._tuple_idx_nullable_map),
_tuple_idx_map(desc._tuple_idx_map),
_has_varlen_slots(desc._has_varlen_slots) {
+ _num_materialized_slots = 0;
_num_null_slots = 0;
std::vector<TupleDescriptor*>::const_iterator it = desc._tuple_desc_map.begin();
for (; it != desc._tuple_desc_map.end(); ++it) {
+ _num_materialized_slots += (*it)->num_materialized_slots();
_num_null_slots += (*it)->num_null_slots();
}
_num_null_bytes = (_num_null_slots + 7) / 8;
@@ -371,6 +378,11 @@ public:
// to GetAvgRowSize()
int get_row_size() const;
+ int num_materialized_slots() const {
+ DCHECK(_num_materialized_slots != 0);
+ return _num_materialized_slots;
+ }
+
int num_null_slots() const { return _num_null_slots; }
int num_null_bytes() const { return _num_null_bytes; }
@@ -413,6 +425,8 @@ public:
std::string debug_string() const;
+ int get_column_id(int slot_id) const;
+
private:
// Initializes tupleIdxMap during c'tor using the _tuple_desc_map.
void init_tuple_idx_map();
@@ -432,6 +446,7 @@ private:
// Provide quick way to check if there are variable length slots.
bool _has_varlen_slots;
+ int _num_materialized_slots;
int _num_null_slots;
int _num_null_bytes;
};
diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h
index 91e8e4c..efb073b 100644
--- a/be/src/runtime/exec_env.h
+++ b/be/src/runtime/exec_env.h
@@ -22,7 +22,9 @@
#include "olap/options.h"
namespace doris {
-
+namespace vectorized {
+class VDataStreamMgr;
+}
class BfdParser;
class BrokerMgr;
class BrpcStubCache;
diff --git a/be/src/runtime/mysql_result_writer.cpp b/be/src/runtime/mysql_result_writer.cpp
index bed88be..444e0db 100644
--- a/be/src/runtime/mysql_result_writer.cpp
+++ b/be/src/runtime/mysql_result_writer.cpp
@@ -32,9 +32,9 @@
namespace doris {
MysqlResultWriter::MysqlResultWriter(BufferControlBlock* sinker,
- const std::vector<ExprContext*>& output_expr_ctxs,
- RuntimeProfile* parent_profile)
- : _sinker(sinker),
+ const std::vector<ExprContext*>& output_expr_ctxs, RuntimeProfile* parent_profile)
+ : ResultWriter(),
+ _sinker(sinker),
_output_expr_ctxs(output_expr_ctxs),
_row_buffer(NULL),
_parent_profile(parent_profile) {}
@@ -49,8 +49,7 @@ Status MysqlResultWriter::init(RuntimeState* state) {
return Status::InternalError("sinker is NULL pointer.");
}
- _row_buffer = new (std::nothrow) MysqlRowBuffer();
-
+ _row_buffer = new(std::nothrow) MysqlRowBuffer();
if (NULL == _row_buffer) {
return Status::InternalError("no memory to alloc.");
}
diff --git a/be/src/runtime/mysql_result_writer.h b/be/src/runtime/mysql_result_writer.h
index 8d8c215..6811488 100644
--- a/be/src/runtime/mysql_result_writer.h
+++ b/be/src/runtime/mysql_result_writer.h
@@ -19,6 +19,7 @@
#include "runtime/result_writer.h"
#include "runtime/runtime_state.h"
+#include "primitive_type.h"
namespace doris {
@@ -29,11 +30,16 @@ class MysqlRowBuffer;
class BufferControlBlock;
class RuntimeProfile;
+namespace vectorized {
+ class VExprContext;
+}
+
// convert the row batch to mysql protocol row
class MysqlResultWriter final : public ResultWriter {
public:
MysqlResultWriter(BufferControlBlock* sinker, const std::vector<ExprContext*>& output_expr_ctxs,
- RuntimeProfile* parent_profile);
+ RuntimeProfile* parent_profile);
+
virtual ~MysqlResultWriter();
virtual Status init(RuntimeState* state) override;
@@ -52,7 +58,11 @@ private:
private:
BufferControlBlock* _sinker;
const std::vector<ExprContext*>& _output_expr_ctxs;
+
+ std::vector<int> _result_column_ids;
+
MysqlRowBuffer* _row_buffer;
+ std::vector<MysqlRowBuffer*> _vec_buffers;
RuntimeProfile* _parent_profile; // parent profile from result sink. not owned
// total time cost on append batch operation
diff --git a/be/src/runtime/plan_fragment_executor.cpp b/be/src/runtime/plan_fragment_executor.cpp
index 2df18a5..0040a4f 100644
--- a/be/src/runtime/plan_fragment_executor.cpp
+++ b/be/src/runtime/plan_fragment_executor.cpp
@@ -162,6 +162,7 @@ Status PlanFragmentExecutor::prepare(const TExecPlanFragmentParams& request,
_plan);
}
+
// set #senders of exchange nodes before calling Prepare()
std::vector<ExecNode*> exch_nodes;
_plan->collect_nodes(TPlanNodeType::EXCHANGE_NODE, &exch_nodes);
@@ -169,7 +170,10 @@ Status PlanFragmentExecutor::prepare(const TExecPlanFragmentParams& request,
DCHECK_EQ(exch_node->type(), TPlanNodeType::EXCHANGE_NODE);
int num_senders = find_with_default(params.per_exch_num_senders, exch_node->id(), 0);
DCHECK_GT(num_senders, 0);
- static_cast<ExchangeNode*>(exch_node)->set_num_senders(num_senders);
+ if (_runtime_state->enable_vectorized_exec()) {
+ } else {
+ static_cast<ExchangeNode *>(exch_node)->set_num_senders(num_senders);
+ }
}
RETURN_IF_ERROR(_plan->prepare(_runtime_state.get()));
@@ -197,7 +201,7 @@ Status PlanFragmentExecutor::prepare(const TExecPlanFragmentParams& request,
if (request.fragment.__isset.output_sink) {
RETURN_IF_ERROR(DataSink::create_data_sink(obj_pool(), request.fragment.output_sink,
request.fragment.output_exprs, params,
- row_desc(), &_sink));
+ row_desc(), runtime_state()->enable_vectorized_exec(), &_sink));
RETURN_IF_ERROR(_sink->prepare(runtime_state()));
RuntimeProfile* sink_profile = _sink->profile();
@@ -249,8 +253,11 @@ Status PlanFragmentExecutor::open() {
_report_thread_started_cv.wait(l);
_report_thread_active = true;
}
-
- Status status = open_internal();
+ Status status = Status::OK();
+ if (_runtime_state->enable_vectorized_exec()) {
+ } else {
+ status = open_internal();
+ }
if (!status.ok() && !status.is_cancelled() && _runtime_state->log_has_space()) {
// Log error message in addition to returning in Status. Queries that do not
diff --git a/be/src/runtime/plan_fragment_executor.h b/be/src/runtime/plan_fragment_executor.h
index 4fcdf9d..96e6170 100644
--- a/be/src/runtime/plan_fragment_executor.h
+++ b/be/src/runtime/plan_fragment_executor.h
@@ -222,6 +222,8 @@ private:
std::shared_ptr<QueryStatistics> _query_statistics;
bool _collect_query_statistics_with_every_batch;
+ bool _enable_vectorized_engine;
+
ObjectPool* obj_pool() { return _runtime_state->obj_pool(); }
// typedef for TPlanFragmentExecParams.per_node_scan_ranges
diff --git a/be/src/runtime/result_sink.cpp b/be/src/runtime/result_sink.cpp
index 931afcb..e99f5c0 100644
--- a/be/src/runtime/result_sink.cpp
+++ b/be/src/runtime/result_sink.cpp
@@ -122,6 +122,7 @@ Status ResultSink::close(RuntimeState* state, Status exec_status) {
state->exec_env()->result_mgr()->cancel_at_time(
time(NULL) + config::result_buffer_cancelled_interval_time,
state->fragment_instance_id());
+
Expr::close(_output_expr_ctxs, state);
_closed = true;
diff --git a/be/src/runtime/result_sink.h b/be/src/runtime/result_sink.h
index 39f34a8..a7c1da4 100644
--- a/be/src/runtime/result_sink.h
+++ b/be/src/runtime/result_sink.h
@@ -36,6 +36,10 @@ class ResultWriter;
class MemTracker;
class ResultFileOptions;
+namespace vectorized {
+ class VExprContext;
+}
+
class ResultSink : public DataSink {
public:
// construct a buffer for the result need send to coordinator.
@@ -74,6 +78,8 @@ private:
boost::shared_ptr<ResultWriter> _writer;
RuntimeProfile* _profile; // Allocated from _pool
int _buf_size; // Allocated from _pool
+
+ bool _is_vec;
};
} // namespace doris
diff --git a/be/src/runtime/result_writer.h b/be/src/runtime/result_writer.h
index 477d79c..3c914d0 100644
--- a/be/src/runtime/result_writer.h
+++ b/be/src/runtime/result_writer.h
@@ -27,16 +27,24 @@ class RowBatch;
class RuntimeState;
class TypeDescriptor;
+namespace vectorized {
+ class Block;
+}
+
// abstract class of the result writer
class ResultWriter {
public:
- ResultWriter(){};
+ ResultWriter() {};
~ResultWriter(){};
virtual Status init(RuntimeState* state) = 0;
// convert and write one row batch
virtual Status append_row_batch(const RowBatch* batch) = 0;
+ // virtual Status append_block(const vectorized::Block& block) {
+ // return Status::InternalError("Not support append vec block now.");
+ // }
+
virtual Status close() = 0;
virtual int64_t get_written_rows() const { return _written_rows; }
diff --git a/be/src/runtime/row_batch.cpp b/be/src/runtime/row_batch.cpp
index 54031c4..bf2ee39 100644
--- a/be/src/runtime/row_batch.cpp
+++ b/be/src/runtime/row_batch.cpp
@@ -29,6 +29,9 @@
#include "gen_cpp/data.pb.h"
#include "runtime/collection_value.h"
+//#include "vec/columns/column_vector.h"
+//#include "vec/core/block.h"
+
using std::vector;
namespace doris {
diff --git a/be/src/runtime/row_batch.h b/be/src/runtime/row_batch.h
index 9349eef..a3e20f3 100644
--- a/be/src/runtime/row_batch.h
+++ b/be/src/runtime/row_batch.h
@@ -31,6 +31,10 @@
#include "runtime/mem_pool.h"
#include "runtime/row_batch_interface.hpp"
+namespace doris::vectorized {
+class Block;
+}
+
namespace doris {
class BufferedTupleStream2;
@@ -40,6 +44,7 @@ class TupleRow;
class TupleDescriptor;
class PRowBatch;
+
// A RowBatch encapsulates a batch of rows, each composed of a number of tuples.
// The maximum number of rows is fixed at the time of construction, and the caller
// can add rows up to that capacity.
diff --git a/be/src/runtime/runtime_state.h b/be/src/runtime/runtime_state.h
index 2152dfd..659741e 100644
--- a/be/src/runtime/runtime_state.h
+++ b/be/src/runtime/runtime_state.h
@@ -346,6 +346,8 @@ public:
int32_t runtime_filter_max_in_num() { return _query_options.runtime_filter_max_in_num; }
+ bool enable_vectorized_exec() const { return _query_options.enable_vectorized_engine; }
+
bool enable_exchange_node_parallel_merge() const {
return _query_options.enable_enable_exchange_node_parallel_merge;
}
diff --git a/be/src/runtime/type_limit.h b/be/src/runtime/type_limit.h
index d46a3bc..45096b5 100644
--- a/be/src/runtime/type_limit.h
+++ b/be/src/runtime/type_limit.h
@@ -26,8 +26,12 @@ namespace doris {
template <typename T>
struct type_limit {
- static T min() { return std::numeric_limits<T>::min(); }
- static T max() { return std::numeric_limits<T>::max(); }
+ static T min() {
+ return std::numeric_limits<T>::lowest();
+ }
+ static T max() {
+ return std::numeric_limits<T>::max();
+ }
};
template <>
diff --git a/be/src/runtime/types.h b/be/src/runtime/types.h
index 30ec41d..a2b18c2 100644
--- a/be/src/runtime/types.h
+++ b/be/src/runtime/types.h
@@ -72,6 +72,10 @@ struct TypeDescriptor {
DCHECK_NE(type, TYPE_ARRAY);
DCHECK_NE(type, TYPE_MAP);
#endif
+ if (type == TYPE_DECIMALV2) {
+ precision = 27;
+ scale = 9;
+ }
}
static TypeDescriptor create_char_type(int len) {
@@ -159,6 +163,8 @@ struct TypeDescriptor {
inline bool is_decimal_type() const { return (type == TYPE_DECIMALV2); }
+ inline bool is_datetime_type() const { return type == TYPE_DATETIME; }
+
inline bool is_var_len_string_type() const {
return type == TYPE_VARCHAR || type == TYPE_HLL || type == TYPE_CHAR || type == TYPE_OBJECT;
}
diff --git a/be/src/service/internal_service.cpp b/be/src/service/internal_service.cpp
index 7afb8c8..f4bdb49 100644
--- a/be/src/service/internal_service.cpp
+++ b/be/src/service/internal_service.cpp
@@ -389,6 +389,18 @@ Status PInternalServiceImpl<T>::_fold_constant_expr(const std::string& ser_reque
return mgr.fold_constant_expr(t_request, response);
}
+template <typename T>
+void PInternalServiceImpl<T>::transmit_block(google::protobuf::RpcController* cntl_base,
+ const PTransmitDataParams* request,
+ PTransmitDataResult* response,
+ google::protobuf::Closure* done) {
+ VLOG_ROW << "transmit data: fragment_instance_id=" << print_id(request->finst_id())
+ << " node=" << request->node_id();
+ if (done != nullptr) {
+ done->Run();
+ }
+}
+
template class PInternalServiceImpl<PBackendService>;
} // namespace doris
diff --git a/be/src/service/internal_service.h b/be/src/service/internal_service.h
index 16722f7..5bbebce 100644
--- a/be/src/service/internal_service.h
+++ b/be/src/service/internal_service.h
@@ -91,6 +91,10 @@ public:
const ::doris::PPublishFilterRequest* request,
::doris::PPublishFilterResponse* response,
::google::protobuf::Closure* done) override;
+ void transmit_block(::google::protobuf::RpcController* controller,
+ const ::doris::PTransmitDataParams* request,
+ ::doris::PTransmitDataResult* response,
+ ::google::protobuf::Closure* done) override;
void send_data(google::protobuf::RpcController* controller, const PSendDataRequest* request,
PSendDataResult* response, google::protobuf::Closure* done);
diff --git a/be/src/util/binary_cast.hpp b/be/src/util/binary_cast.hpp
index 8239580..d528d71 100644
--- a/be/src/util/binary_cast.hpp
+++ b/be/src/util/binary_cast.hpp
@@ -20,6 +20,7 @@
#include <cstdint>
#include <type_traits>
+#include "runtime/datetime_value.h"
#include "runtime/decimalv2_value.h"
#include "util/types.h"
@@ -40,9 +41,20 @@ inline constexpr bool match_v = std::is_same_v<C0, C1>&& std::is_same_v<T0, T1>;
union DecimalInt128Union {
DecimalV2Value decimal;
PackedInt128 packed128;
+ __int128_t i128;
};
static_assert(sizeof(DecimalV2Value) == sizeof(PackedInt128));
+static_assert(sizeof(DecimalV2Value) == sizeof(__int128_t));
+
+// we need provide a destructor becase DateTimeValue was not a pod type
+// DateTimeValue won't alloc any extra memory, so we don't have to call
+// DateTimeValue::~DateTimeValue()
+union DateTimeInt128Union {
+ DateTimeValue dt;
+ __int128_t i128;
+ ~DateTimeInt128Union() {}
+};
// similar to reinterpret_cast but won't break strict-aliasing rules
template <typename From, typename To>
@@ -52,9 +64,14 @@ To binary_cast(From from) {
constexpr bool from_db_to_i64 = match_v<From, double, To, int64_t>;
constexpr bool from_db_to_u64 = match_v<From, double, To, uint64_t>;
constexpr bool from_decv2_to_packed128 = match_v<From, DecimalV2Value, To, PackedInt128>;
-
+ constexpr bool from_i128_to_dt = match_v<From, __int128_t, To, DateTimeValue>;
+ constexpr bool from_dt_to_i128 = match_v<From, DateTimeValue, To, __int128_t>;
+ constexpr bool from_i128_to_decv2 = match_v<From, __int128_t, To, DecimalV2Value>;
+ constexpr bool from_decv2_to_i128 = match_v<From, DecimalV2Value, To, __int128_t>;
+
static_assert(from_u64_to_db || from_i64_to_db || from_db_to_i64 || from_db_to_u64 ||
- from_decv2_to_packed128);
+ from_decv2_to_packed128 || from_i128_to_dt || from_dt_to_i128 ||
+ from_i128_to_decv2 || from_decv2_to_i128);
if constexpr (from_u64_to_db) {
TypeConverter conv;
@@ -76,6 +93,20 @@ To binary_cast(From from) {
DecimalInt128Union conv;
conv.decimal = from;
return conv.packed128;
+ } else if constexpr (from_i128_to_dt) {
+ DateTimeInt128Union conv = {.i128 = from};
+ return conv.dt;
+ } else if constexpr (from_dt_to_i128) {
+ DateTimeInt128Union conv = {.dt = from};
+ return conv.i128;
+ } else if constexpr (from_i128_to_decv2) {
+ DecimalInt128Union conv;
+ conv.i128 = from;
+ return conv.decimal;
+ } else if constexpr (from_decv2_to_i128) {
+ DecimalInt128Union conv;
+ conv.decimal = from;
+ return conv.i128;
} else {
__builtin_unreachable();
}
diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h
index 2b3dc47..52f39c5 100644
--- a/be/src/util/bitmap_value.h
+++ b/be/src/util/bitmap_value.h
@@ -1189,7 +1189,7 @@ public:
// check if value x is present
- bool contains(uint64_t x) {
+ bool contains(uint64_t x) const {
switch (_type) {
case EMPTY:
return false;
diff --git a/be/src/util/brpc_stub_cache.h b/be/src/util/brpc_stub_cache.h
index 3b9407f..940883d 100644
--- a/be/src/util/brpc_stub_cache.h
+++ b/be/src/util/brpc_stub_cache.h
@@ -32,9 +32,9 @@ namespace doris {
class BrpcStubCache {
public:
BrpcStubCache();
- ~BrpcStubCache();
+ virtual ~BrpcStubCache();
- PBackendService_Stub* get_stub(const butil::EndPoint& endpoint) {
+ virtual PBackendService_Stub* get_stub(const butil::EndPoint& endpoint) {
std::lock_guard<SpinLock> l(_lock);
auto stub_ptr = _stub_map.seek(endpoint);
if (stub_ptr != nullptr) {
@@ -52,7 +52,7 @@ public:
return stub;
}
- PBackendService_Stub* get_stub(const TNetworkAddress& taddr) {
+ virtual PBackendService_Stub* get_stub(const TNetworkAddress& taddr) {
butil::EndPoint endpoint;
if (str2endpoint(taddr.hostname.c_str(), taddr.port, &endpoint)) {
LOG(WARNING) << "unknown endpoint, hostname=" << taddr.hostname;
@@ -61,7 +61,7 @@ public:
return get_stub(endpoint);
}
- PBackendService_Stub* get_stub(const std::string& host, int port) {
+ virtual PBackendService_Stub* get_stub(const std::string& host, int port) {
butil::EndPoint endpoint;
if (str2endpoint(host.c_str(), port, &endpoint)) {
LOG(WARNING) << "unknown endpoint, hostname=" << host;
diff --git a/be/src/util/hash_util.hpp b/be/src/util/hash_util.hpp
index 9667b51..050032c 100644
--- a/be/src/util/hash_util.hpp
+++ b/be/src/util/hash_util.hpp
@@ -376,7 +376,7 @@ struct hash<doris::TNetworkAddress> {
}
};
-#if !defined(IR_COMPILE) && __GNUC__ < 6
+#if !defined(IR_COMPILE) && __GNUC__ < 6 && !defined(__clang__)
// Cause this is builtin function
template <>
struct hash<__int128> {
diff --git a/be/src/util/radix_sort.h b/be/src/util/radix_sort.h
index 1ccecda..eaa8487 100644
--- a/be/src/util/radix_sort.h
+++ b/be/src/util/radix_sort.h
@@ -192,7 +192,7 @@ using RadixSortNumTraits = conditional_t<
* To use RadixSort, you should define `Traits` to give out the information for sorting.
* `RadixSortFloatTraits` is a good example to refer to.
* Then you can run it as follows:
- * RadixSort<YourTraits>::executeLSD(arr, size);
+ * RadixSort<YourTraits>::execute_lsd(arr, size);
*
* In particular, if you want to sort an array of numeric, you can use it easily as follows:
* radixSortLSD(array_of_numeric, array_size);
diff --git a/be/test/exec/broker_scan_node_test.cpp b/be/test/exec/broker_scan_node_test.cpp
index 4936db8..7f6d1d1 100644
--- a/be/test/exec/broker_scan_node_test.cpp
+++ b/be/test/exec/broker_scan_node_test.cpp
@@ -401,6 +401,7 @@ void BrokerScanNodeTest::init() {
TEST_F(BrokerScanNodeTest, normal) {
BrokerScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
auto status = scan_node.prepare(&_runtime_state);
ASSERT_TRUE(status.ok());
diff --git a/be/test/exec/json_scanner_test.cpp b/be/test/exec/json_scanner_test.cpp
index b244e97..7aa43af 100644
--- a/be/test/exec/json_scanner_test.cpp
+++ b/be/test/exec/json_scanner_test.cpp
@@ -531,6 +531,7 @@ void JsonScannerTest::init() {
TEST_F(JsonScannerTest, normal_simple_arrayjson) {
BrokerScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
auto status = scan_node.prepare(&_runtime_state);
ASSERT_TRUE(status.ok());
@@ -580,6 +581,7 @@ TEST_F(JsonScannerTest, normal_simple_arrayjson) {
// Use num_as_string load data again
BrokerScanNode scan_node2(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node2.init(_tnode);
status = scan_node2.prepare(&_runtime_state);
ASSERT_TRUE(status.ok());
scan_ranges.clear();
diff --git a/be/test/exec/json_scanner_test_with_jsonpath.cpp b/be/test/exec/json_scanner_test_with_jsonpath.cpp
index d3d86a8..8c1eb17 100644
--- a/be/test/exec/json_scanner_test_with_jsonpath.cpp
+++ b/be/test/exec/json_scanner_test_with_jsonpath.cpp
@@ -359,6 +359,7 @@ void JsonScannerTest::init() {
TEST_F(JsonScannerTest, normal) {
BrokerScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
auto status = scan_node.prepare(&_runtime_state);
ASSERT_TRUE(status.ok());
diff --git a/be/test/exec/parquet_scanner_test.cpp b/be/test/exec/parquet_scanner_test.cpp
index 399c364..e6b6114 100644
--- a/be/test/exec/parquet_scanner_test.cpp
+++ b/be/test/exec/parquet_scanner_test.cpp
@@ -420,6 +420,7 @@ void ParquetScannerTest::init() {
TEST_F(ParquetScannerTest, normal) {
BrokerScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
auto status = scan_node.prepare(&_runtime_state);
ASSERT_TRUE(status.ok());
diff --git a/be/test/olap/column_reader_test.cpp b/be/test/olap/column_reader_test.cpp
index 44159f6..dacefba 100644
--- a/be/test/olap/column_reader_test.cpp
+++ b/be/test/olap/column_reader_test.cpp
@@ -78,7 +78,7 @@ public:
_length_buffers.clear();
}
- void CreateColumnWriter(const TabletSchema& tablet_schema) {
+ void create_columnWriter(const TabletSchema& tablet_schema) {
_column_writer = ColumnWriter::create(0, tablet_schema, _stream_factory, 1024,
BLOOM_FILTER_DEFAULT_FPP);
@@ -86,15 +86,15 @@ public:
ASSERT_EQ(_column_writer->init(), OLAP_SUCCESS);
}
- void CreateColumnReader(const TabletSchema& tablet_schema) {
+ void create_columnReader(const TabletSchema& tablet_schema) {
UniqueIdEncodingMap encodings;
encodings[0] = ColumnEncodingMessage();
encodings[0].set_kind(ColumnEncodingMessage::DIRECT);
encodings[0].set_dictionary_size(1);
- CreateColumnReader(tablet_schema, encodings);
+ create_columnReader(tablet_schema, encodings);
}
- void CreateColumnReader(const TabletSchema& tablet_schema, UniqueIdEncodingMap& encodings) {
+ void create_columnReader(const TabletSchema& tablet_schema, UniqueIdEncodingMap& encodings) {
UniqueIdToColumnIdMap included;
included[0] = 0;
UniqueIdToColumnIdMap segment_included;
@@ -219,7 +219,7 @@ TEST_F(TestColumn, VectorizedTinyColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -244,7 +244,7 @@ TEST_F(TestColumn, VectorizedTinyColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -267,7 +267,7 @@ TEST_F(TestColumn, SeekTinyColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -303,7 +303,7 @@ TEST_F(TestColumn, SeekTinyColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -345,7 +345,7 @@ TEST_F(TestColumn, SkipTinyColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -374,7 +374,7 @@ TEST_F(TestColumn, SkipTinyColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -391,7 +391,7 @@ TEST_F(TestColumn, VectorizedTinyColumnWithPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -416,7 +416,7 @@ TEST_F(TestColumn, VectorizedTinyColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -435,7 +435,7 @@ TEST_F(TestColumn, TinyColumnIndex) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -460,7 +460,7 @@ TEST_F(TestColumn, TinyColumnIndex) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -479,7 +479,7 @@ TEST_F(TestColumn, SeekTinyColumnWithPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -515,7 +515,7 @@ TEST_F(TestColumn, SeekTinyColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -554,7 +554,7 @@ TEST_F(TestColumn, SkipTinyColumnWithPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("TinyColumn", "TINYINT", "REPLACE", 1, true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -583,7 +583,7 @@ TEST_F(TestColumn, SkipTinyColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -601,7 +601,7 @@ TEST_F(TestColumn, VectorizedShortColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -626,7 +626,7 @@ TEST_F(TestColumn, VectorizedShortColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -646,7 +646,7 @@ TEST_F(TestColumn, SeekShortColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -680,7 +680,7 @@ TEST_F(TestColumn, SeekShortColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -721,7 +721,7 @@ TEST_F(TestColumn, SkipShortColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -750,7 +750,7 @@ TEST_F(TestColumn, SkipShortColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -768,7 +768,7 @@ TEST_F(TestColumn, SeekShortColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -802,7 +802,7 @@ TEST_F(TestColumn, SeekShortColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -841,7 +841,7 @@ TEST_F(TestColumn, VectorizedShortColumnWithPresent) {
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -866,7 +866,7 @@ TEST_F(TestColumn, VectorizedShortColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -888,7 +888,7 @@ TEST_F(TestColumn, SkipShortColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("ShortColumn", "SMALLINT", "REPLACE", 2, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -916,7 +916,7 @@ TEST_F(TestColumn, SkipShortColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -933,7 +933,7 @@ TEST_F(TestColumn, VectorizedIntColumnWithoutPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("IntColumn", "INT", "REPLACE", 4, false, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -958,7 +958,7 @@ TEST_F(TestColumn, VectorizedIntColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -977,7 +977,7 @@ TEST_F(TestColumn, VectorizedIntColumnMassWithoutPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("IntColumn", "INT", "REPLACE", 4, false, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -998,7 +998,7 @@ TEST_F(TestColumn, VectorizedIntColumnMassWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1024,7 +1024,7 @@ TEST_F(TestColumn, VectorizedIntColumnWithPresent) {
// write data
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("IntColumn", "INT", "REPLACE", 4, true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1049,7 +1049,7 @@ TEST_F(TestColumn, VectorizedIntColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1072,7 +1072,7 @@ TEST_F(TestColumn, VectorizedLongColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("LongColumnWithoutPresent", "BIGINT", "REPLACE", 8, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1098,7 +1098,7 @@ TEST_F(TestColumn, VectorizedLongColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1118,7 +1118,7 @@ TEST_F(TestColumn, VectorizedLongColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("LongColumnWithPresent", "BIGINT", "REPLACE", 8, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1144,7 +1144,7 @@ TEST_F(TestColumn, VectorizedLongColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1166,7 +1166,7 @@ TEST_F(TestColumn, VectorizedFloatColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("FloatColumnWithoutPresent", "FLOAT", "REPLACE", 4, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1192,7 +1192,7 @@ TEST_F(TestColumn, VectorizedFloatColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1214,7 +1214,7 @@ TEST_F(TestColumn, VectorizedFloatColumnWithPresent) {
SetTabletSchemaWithOneColumn("FloatColumnWithPresent", "FLOAT", "REPLACE", 4, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1240,7 +1240,7 @@ TEST_F(TestColumn, VectorizedFloatColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1263,7 +1263,7 @@ TEST_F(TestColumn, SeekFloatColumnWithPresent) {
SetTabletSchemaWithOneColumn("FloatColumnWithPresent", "FLOAT", "REPLACE", 4, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1293,7 +1293,7 @@ TEST_F(TestColumn, SeekFloatColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1328,7 +1328,7 @@ TEST_F(TestColumn, SkipFloatColumnWithPresent) {
SetTabletSchemaWithOneColumn("FloatColumnWithPresent", "FLOAT", "REPLACE", 4, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1354,7 +1354,7 @@ TEST_F(TestColumn, SkipFloatColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1373,7 +1373,7 @@ TEST_F(TestColumn, VectorizedDoubleColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DoubleColumnWithoutPresent", "DOUBLE", "REPLACE", 8, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1399,7 +1399,7 @@ TEST_F(TestColumn, VectorizedDoubleColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1421,7 +1421,7 @@ TEST_F(TestColumn, VectorizedDoubleColumnWithPresent) {
SetTabletSchemaWithOneColumn("DoubleColumnWithPresent", "DOUBLE", "REPLACE", 8, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1447,7 +1447,7 @@ TEST_F(TestColumn, VectorizedDoubleColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1471,7 +1471,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DatetimeColumnWithoutPresent", "DATETIME", "REPLACE", 8, false,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1493,7 +1493,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1512,7 +1512,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnWithPresent) {
SetTabletSchemaWithOneColumn("DatetimeColumnWithoutPresent", "DATETIME", "REPLACE", 8, true,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1540,7 +1540,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1566,7 +1566,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnZero) {
SetTabletSchemaWithOneColumn("DatetimeColumnWithoutPresent", "DATETIME", "REPLACE", 8, true,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1594,7 +1594,7 @@ TEST_F(TestColumn, VectorizedDatetimeColumnZero) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1622,7 +1622,7 @@ TEST_F(TestColumn, VectorizedDateColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DateColumnWithoutoutPresent", "DATE", "REPLACE", 3, false, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1644,7 +1644,7 @@ TEST_F(TestColumn, VectorizedDateColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1662,7 +1662,7 @@ TEST_F(TestColumn, VectorizedDateColumnWithPresent) {
SetTabletSchemaWithOneColumn("DateColumnWithoutoutPresent", "DATE", "REPLACE", 3, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1692,7 +1692,7 @@ TEST_F(TestColumn, VectorizedDateColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1718,7 +1718,7 @@ TEST_F(TestColumn, VectorizedDecimalColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DecimalColumnWithoutoutPresent", "DECIMAL", "REPLACE", 12, false,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1748,7 +1748,7 @@ TEST_F(TestColumn, VectorizedDecimalColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1770,7 +1770,7 @@ TEST_F(TestColumn, VectorizedDecimalColumnWithPresent) {
SetTabletSchemaWithOneColumn("DecimalColumnWithoutoutPresent", "DECIMAL", "REPLACE", 12, true,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1799,7 +1799,7 @@ TEST_F(TestColumn, VectorizedDecimalColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1822,7 +1822,7 @@ TEST_F(TestColumn, SkipDecimalColumnWithPresent) {
SetTabletSchemaWithOneColumn("DecimalColumnWithPresent", "DECIMAL", "REPLACE", 12, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1850,7 +1850,7 @@ TEST_F(TestColumn, SkipDecimalColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1870,7 +1870,7 @@ TEST_F(TestColumn, SeekDecimalColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("DecimalColumnWithPresent", "DECIMAL", "REPLACE", 12, true, true,
&tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1904,7 +1904,7 @@ TEST_F(TestColumn, SeekDecimalColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -1950,7 +1950,7 @@ TEST_F(TestColumn, VectorizedLargeIntColumnWithoutPresent) {
string value2 = "-170141183460469231731687303715884105728";
// write data
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -1979,7 +1979,7 @@ TEST_F(TestColumn, VectorizedLargeIntColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2007,7 +2007,7 @@ TEST_F(TestColumn, VectorizedLargeIntColumnWithPresent) {
string value2 = "-170141183460469231731687303715884105728";
// write data
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2043,7 +2043,7 @@ TEST_F(TestColumn, VectorizedLargeIntColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2078,7 +2078,7 @@ TEST_F(TestColumn, SkipLargeIntColumnWithPresent) {
string value2 = "-170141183460469231731687303715884105728";
// write data
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2107,7 +2107,7 @@ TEST_F(TestColumn, SkipLargeIntColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2127,7 +2127,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithoutoutPresent", "VARCHAR", "REPLACE", 10,
false, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2164,7 +2164,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2191,7 +2191,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithoutoutPresent", "VARCHAR", "REPLACE", 10,
true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2220,7 +2220,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2243,7 +2243,7 @@ TEST_F(TestColumn, SkipDirectVarcharColumnWithPresent) {
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithPresent", "VARCHAR", "REPLACE", 10, true,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2274,7 +2274,7 @@ TEST_F(TestColumn, SkipDirectVarcharColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2295,7 +2295,7 @@ TEST_F(TestColumn, SeekDirectVarcharColumnWithoutPresent) {
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithPresent", "VARCHAR", "REPLACE", 10, false,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2330,7 +2330,7 @@ TEST_F(TestColumn, SeekDirectVarcharColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2368,7 +2368,7 @@ TEST_F(TestColumn, SeekDirectVarcharColumnWithPresent) {
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithPresent", "VARCHAR", "REPLACE", 10, true,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2403,7 +2403,7 @@ TEST_F(TestColumn, SeekDirectVarcharColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2440,7 +2440,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithoutPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("VarcharColumnWithoutoutPresent", "CHAR", "REPLACE",
strlen("abcde"), false, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2477,7 +2477,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithoutPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2504,7 +2504,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithPresent) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("VarcharColumnWithoutoutPresent", "CHAR", "REPLACE",
strlen("abcde"), true, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2531,7 +2531,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithPresent) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2553,7 +2553,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithoutoutPresent2) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("VarcharColumnWithoutoutPresent", "CHAR", "REPLACE", 20, false,
true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2608,7 +2608,7 @@ TEST_F(TestColumn, VectorizedStringColumnWithoutoutPresent2) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
@@ -2638,7 +2638,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWith65533) {
TabletSchema tablet_schema;
SetTabletSchemaWithOneColumn("DirectVarcharColumnWithoutoutPresent", "VARCHAR", "REPLACE",
65535, false, true, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -2671,7 +2671,7 @@ TEST_F(TestColumn, VectorizedDirectVarcharColumnWith65533) {
ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
// read data
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(tablet_schema);
diff --git a/be/test/olap/schema_change_test.cpp b/be/test/olap/schema_change_test.cpp
index 9001556..3129b5b 100644
--- a/be/test/olap/schema_change_test.cpp
+++ b/be/test/olap/schema_change_test.cpp
@@ -82,22 +82,22 @@ public:
_length_buffers.clear();
}
- void CreateColumnWriter(const TabletSchema& tablet_schema) {
+ void create_columnWriter(const TabletSchema& tablet_schema) {
_column_writer = ColumnWriter::create(0, tablet_schema, _stream_factory, 1024,
BLOOM_FILTER_DEFAULT_FPP);
ASSERT_TRUE(_column_writer != NULL);
ASSERT_EQ(_column_writer->init(), OLAP_SUCCESS);
}
- void CreateColumnReader(const TabletSchema& tablet_schema) {
+ void create_columnReader(const TabletSchema& tablet_schema) {
UniqueIdEncodingMap encodings;
encodings[0] = ColumnEncodingMessage();
encodings[0].set_kind(ColumnEncodingMessage::DIRECT);
encodings[0].set_dictionary_size(1);
- CreateColumnReader(tablet_schema, encodings);
+ create_columnReader(tablet_schema, encodings);
}
- void CreateColumnReader(const TabletSchema& tablet_schema, UniqueIdEncodingMap& encodings) {
+ void create_columnReader(const TabletSchema& tablet_schema, UniqueIdEncodingMap& encodings) {
UniqueIdToColumnIdMap included;
included[0] = 0;
UniqueIdToColumnIdMap segment_included;
@@ -204,7 +204,7 @@ public:
TabletSchema src_tablet_schema;
SetTabletSchema("ConvertColumn", type_name, "REPLACE", type_size, false, false,
&src_tablet_schema);
- CreateColumnWriter(src_tablet_schema);
+ create_columnWriter(src_tablet_schema);
RowCursor write_row;
write_row.init(src_tablet_schema);
@@ -223,7 +223,7 @@ public:
TabletSchema dst_tablet_schema;
SetTabletSchema("VarcharColumn", "VARCHAR", "REPLACE", 255, false, false,
&dst_tablet_schema);
- CreateColumnReader(src_tablet_schema);
+ create_columnReader(src_tablet_schema);
RowCursor read_row;
read_row.init(dst_tablet_schema);
@@ -247,7 +247,7 @@ public:
const std::string& value, OLAPStatus expected_st) {
TabletSchema tablet_schema;
SetTabletSchema("VarcharColumn", "VARCHAR", "REPLACE", 255, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -267,7 +267,7 @@ public:
TabletSchema converted_tablet_schema;
SetTabletSchema("ConvertColumn", type_name, "REPLACE", type_size, false, false,
&converted_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(converted_tablet_schema);
@@ -311,7 +311,7 @@ public:
TEST_F(TestColumn, ConvertFloatToDouble) {
TabletSchema tablet_schema;
SetTabletSchema("FloatColumn", "FLOAT", "REPLACE", 4, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -339,7 +339,7 @@ TEST_F(TestColumn, ConvertFloatToDouble) {
// read data
TabletSchema convert_tablet_schema;
SetTabletSchema("DoubleColumn", "DOUBLE", "REPLACE", 4, false, false, &convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
_col_vector.reset(new ColumnVector());
@@ -365,7 +365,7 @@ TEST_F(TestColumn, ConvertFloatToDouble) {
TEST_F(TestColumn, ConvertDatetimeToDate) {
TabletSchema tablet_schema;
SetTabletSchema("DatetimeColumn", "DATETIME", "REPLACE", 8, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -389,7 +389,7 @@ TEST_F(TestColumn, ConvertDatetimeToDate) {
// read data
TabletSchema convert_tablet_schema;
SetTabletSchema("DateColumn", "DATE", "REPLACE", 3, false, false, &convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
@@ -409,7 +409,7 @@ TEST_F(TestColumn, ConvertDatetimeToDate) {
TEST_F(TestColumn, ConvertDateToDatetime) {
TabletSchema tablet_schema;
SetTabletSchema("DateColumn", "DATE", "REPLACE", 3, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -434,7 +434,7 @@ TEST_F(TestColumn, ConvertDateToDatetime) {
TabletSchema convert_tablet_schema;
SetTabletSchema("DateTimeColumn", "DATETIME", "REPLACE", 8, false, false,
&convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
_col_vector.reset(new ColumnVector());
@@ -454,7 +454,7 @@ TEST_F(TestColumn, ConvertDateToDatetime) {
TEST_F(TestColumn, ConvertIntToDate) {
TabletSchema tablet_schema;
SetTabletSchema("IntColumn", "INT", "REPLACE", 4, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -475,7 +475,7 @@ TEST_F(TestColumn, ConvertIntToDate) {
TabletSchema convert_tablet_schema;
SetTabletSchema("DateColumn", "DATE", "REPLACE", 3, false, false, &convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
@@ -496,7 +496,7 @@ TEST_F(TestColumn, ConvertIntToDate) {
TEST_F(TestColumn, ConvertVarcharToDate) {
TabletSchema tablet_schema;
SetTabletSchema("VarcharColumn", "VARCHAR", "REPLACE", 255, false, false, &tablet_schema);
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -524,7 +524,7 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
helper.close();
TabletSchema convert_tablet_schema;
SetTabletSchema("DateColumn", "DATE", "REPLACE", 3, false, false, &convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
@@ -538,7 +538,7 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
helper.close();
TabletSchema convert_tablet_schema;
SetTabletSchema("DateColumn", "DATE", "REPLACE", 3, false, false, &convert_tablet_schema);
- CreateColumnReader(tablet_schema);
+ create_columnReader(tablet_schema);
RowCursor read_row;
read_row.init(convert_tablet_schema);
@@ -709,7 +709,7 @@ TEST_F(TestColumn, ConvertIntToBitmap) {
TabletSchema tablet_schema;
CreateTabletSchema(tablet_schema);
//Base row block
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -790,7 +790,7 @@ TEST_F(TestColumn, ConvertCharToHLL) {
CreateTabletSchema(tablet_schema);
//Base row block
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowCursor write_row;
write_row.init(tablet_schema);
@@ -873,7 +873,7 @@ TEST_F(TestColumn, ConvertCharToCount) {
CreateTabletSchema(tablet_schema);
//Base row block
- CreateColumnWriter(tablet_schema);
+ create_columnWriter(tablet_schema);
RowBlock block(&tablet_schema);
RowBlockInfo block_info;
diff --git a/be/test/runtime/CMakeLists.txt b/be/test/runtime/CMakeLists.txt
index fc3e37a..f956896 100644
--- a/be/test/runtime/CMakeLists.txt
+++ b/be/test/runtime/CMakeLists.txt
@@ -28,7 +28,7 @@ ADD_BE_TEST(free_list_test)
ADD_BE_TEST(string_buffer_test)
#ADD_BE_TEST(data_stream_test)
#ADD_BE_TEST(parallel_executor_test)
-ADD_BE_TEST(datetime_value_test)
+#ADD_BE_TEST(datetime_value_test)
ADD_BE_TEST(decimalv2_value_test)
ADD_BE_TEST(large_int_value_test)
ADD_BE_TEST(string_value_test)
diff --git a/be/test/runtime/memory_scratch_sink_test.cpp b/be/test/runtime/memory_scratch_sink_test.cpp
index a0d79a0..b2443ac 100644
--- a/be/test/runtime/memory_scratch_sink_test.cpp
+++ b/be/test/runtime/memory_scratch_sink_test.cpp
@@ -219,6 +219,7 @@ TEST_F(MemoryScratchSinkTest, work_flow_normal) {
_tnode.csv_scan_node.__set_file_paths(file_paths);
CsvScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
Status status = scan_node.prepare(_state);
ASSERT_TRUE(status.ok());
diff --git a/be/test/util/arrow/arrow_work_flow_test.cpp b/be/test/util/arrow/arrow_work_flow_test.cpp
index b237f21..6fd4e62 100644
--- a/be/test/util/arrow/arrow_work_flow_test.cpp
+++ b/be/test/util/arrow/arrow_work_flow_test.cpp
@@ -298,6 +298,7 @@ TEST_F(ArrowWorkFlowTest, NormalUse) {
_tnode.csv_scan_node.__set_file_paths(file_paths);
CsvScanNode scan_node(&_obj_pool, _tnode, *_desc_tbl);
+ scan_node.init(_tnode);
Status status = scan_node.prepare(_state);
ASSERT_TRUE(status.ok());
diff --git a/build.sh b/build.sh
index 36ffb6d..d430cdb 100755
--- a/build.sh
+++ b/build.sh
@@ -42,6 +42,14 @@ export DORIS_HOME=${ROOT}
. ${DORIS_HOME}/env.sh
+# build thirdparty libraries if necessary
+if [[ ! -f ${DORIS_THIRDPARTY}/installed/lib/libs2.a ]]; then
+ echo "Thirdparty libraries need to be build ..."
+ ${DORIS_THIRDPARTY}/build-thirdparty.sh
+fi
+
+PARALLEL=$[$(nproc)/4+1]
+
# Check args
usage() {
echo "
@@ -84,7 +92,7 @@ fi
eval set -- "$OPTS"
-PARALLEL=$[$(nproc)/4+1]
+PARALLEL=$[$(nproc)+1]
BUILD_BE=
BUILD_FE=
BUILD_UI=
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
index 91dafce..04e3244 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
@@ -18,7 +18,7 @@
package org.apache.doris.analysis;
import org.apache.doris.catalog.AggregateFunction;
-import org.apache.doris.catalog.FunctionSet;
+import org.apache.doris.catalog.Function;
import org.apache.doris.catalog.Type;
import com.google.common.base.MoreObjects;
@@ -102,7 +102,7 @@ public abstract class AggregateInfoBase {
// Create the intermediate tuple desc first, so that the tuple ids are increasing
// from bottom to top in the plan tree.
intermediateTupleDesc_ = createTupleDesc(analyzer, false);
- if (requiresIntermediateTuple(aggregateExprs_)) {
+ if (requiresIntermediateTuple(aggregateExprs_, groupingExprs_.size() == 0)) {
outputTupleDesc_ = createTupleDesc(analyzer, true);
} else {
outputTupleDesc_ = intermediateTupleDesc_;
@@ -148,16 +148,11 @@ public abstract class AggregateInfoBase {
slotDesc.setSourceExpr(aggExpr);
}
- // COUNT(), NDV() and NDV_NO_FINALIZE() are non-nullable. The latter two are used
- // by compute stats and compute incremental stats, respectively.
- if (aggExpr.getFnName().getFunction().equals(FunctionSet.COUNT)
- || aggExpr.getFnName().getFunction().equals("ndv")
- || aggExpr.getFnName().getFunction().equals(FunctionSet.BITMAP_UNION_INT)
- || aggExpr.getFnName().getFunction().equals("ndv_no_finalize")) {
- // TODO: Consider making nullability a property of types or of builtin agg fns.
- // row_number(), rank(), and dense_rank() are non-nullable as well.
- slotDesc.setIsNullable(false);
+ if (isOutputTuple && aggExpr.getFn().getNullableMode().equals(Function.NullableMode.DEPEND_ON_ARGUMENT) &&
+ groupingExprs_.size() == 0) {
+ slotDesc.setIsNullable(true);
}
+
if (!isOutputTuple) {
Type intermediateType = ((AggregateFunction)aggExpr.fn).getIntermediateType();
if (intermediateType != null) {
@@ -212,6 +207,21 @@ public abstract class AggregateInfoBase {
return false;
}
+ /**
+ * output tuple maybe different from intermediate when noGrouping and fn null mode
+ * is depend on argument
+ */
+ public static <T extends Expr> boolean requiresIntermediateTuple(List<T> aggExprs, boolean noGrouping) {
+ for (Expr aggExpr: aggExprs) {
+ Type intermediateType = ((AggregateFunction) aggExpr.fn).getIntermediateType();
+ if (intermediateType != null) return true;
+ if (noGrouping && ((AggregateFunction) aggExpr.fn).getNullableMode().equals(Function.NullableMode.DEPEND_ON_ARGUMENT)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public String debugString() {
StringBuilder out = new StringBuilder();
out.append(MoreObjects.toStringHelper(this)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
index b02eb0c..c07a39a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
@@ -23,6 +23,7 @@ import org.apache.doris.catalog.PrimitiveType;
import org.apache.doris.catalog.ScalarFunction;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.thrift.TExprNode;
import org.apache.doris.thrift.TExprNodeType;
import org.apache.doris.thrift.TExprOpcode;
@@ -105,17 +106,57 @@ public class ArithmeticExpr extends Expr {
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE),
- Type.DOUBLE));
+ Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
- Type.DECIMALV2));
+ Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
// MOD(), FACTORIAL(), BITAND(), BITOR(), BITXOR(), and BITNOT() are registered as
// builtins, see palo_functions.py
for (Type t : Type.getIntegerTypes()) {
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
- Operator.INT_DIVIDE.getName(), Lists.newArrayList(t, t), t));
+ Operator.INT_DIVIDE.getName(), Lists.newArrayList(t, t),
+ t, Function.NullableMode.ALWAYS_NULLABLE));
+ }
+
+ // init vec build function
+ for (int i = 0; i < Type.getNumericTypes().size(); i++) {
+ Type t1 = Type.getNumericTypes().get(i);
+ for (int j = 0; j < Type.getNumericTypes().size(); j++) {
+ Type t2 = Type.getNumericTypes().get(j);
+
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.MULTIPLY.getName(), Lists.newArrayList(t1, t2),
+ Type.getAssignmentCompatibleType(t1, t2, false)));
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.ADD.getName(), Lists.newArrayList(t1, t2),
+ Type.getAssignmentCompatibleType(t1, t2, false)));
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.SUBTRACT.getName(), Lists.newArrayList(t1, t2),
+ Type.getAssignmentCompatibleType(t1, t2, false)));
+ }
+ }
+
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.DIVIDE.getName(),
+ Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE),
+ Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.DIVIDE.getName(),
+ Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
+ Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
+
+ for (int i = 0; i < Type.getIntegerTypes().size(); i++) {
+ Type t1 = Type.getIntegerTypes().get(i);
+ for (int j = 0; j < Type.getIntegerTypes().size(); j++) {
+ Type t2 = Type.getIntegerTypes().get(j);
+
+ functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
+ Operator.INT_DIVIDE.getName(), Lists.newArrayList(t1, t2),
+ Type.getAssignmentCompatibleType(t1, t2, false),
+ Function.NullableMode.ALWAYS_NULLABLE));
+ }
}
}
@@ -211,67 +252,104 @@ public class ArithmeticExpr extends Expr {
@Override
public void analyzeImpl(Analyzer analyzer) throws AnalysisException {
- // bitnot is the only unary op, deal with it here
- if (op == Operator.BITNOT) {
- type = Type.BIGINT;
- if (getChild(0).getType().getPrimitiveType() != PrimitiveType.BIGINT) {
- castChild(type, 0);
+ if (VectorizedUtil.isVectorized()) {
+ analyzeSubqueryInChildren();
+ // if children has subquery, it will be rewritten and reanalyzed in the future.
+ if (contains(Subquery.class)) {
+ return;
}
- fn = getBuiltinFunction(
- analyzer, op.getName(), collectChildReturnTypes(), Function.CompareMode.IS_SUPERTYPE_OF);
- if (fn == null) {
- Preconditions.checkState(false, String.format("No match for op with operand types", toSql()));
- }
- return;
- }
- analyzeSubqueryInChildren();
- // if children has subquery, it will be rewritten and reanalyzed in the future.
- if (contains(Subquery.class)) {
- return;
- }
+ Type t1 = getChild(0).getType();
+ Type t2 = getChild(1).getType();
+
+ switch (op) {
+ case MULTIPLY:
+ case ADD:
+ case SUBTRACT:
+ case MOD:
+ case INT_DIVIDE:
+ fn = getBuiltinFunction(analyzer, op.name, collectChildReturnTypes(),
+ Function.CompareMode.IS_IDENTICAL);
+ break;
+ case DIVIDE:
+ t1 = getChild(0).getType().getNumResultType();
+ t2 = getChild(1).getType().getNumResultType();
+ Type commonType = findCommonType(t1, t2);
+ if (commonType.getPrimitiveType() == PrimitiveType.BIGINT
+ || commonType.getPrimitiveType() == PrimitiveType.LARGEINT) {
+ commonType = Type.DOUBLE;
+ }
+ castBinaryOp(commonType);
+ fn = getBuiltinFunction(analyzer, op.name, collectChildReturnTypes(),
+ Function.CompareMode.IS_IDENTICAL);
+ break;
+ }
- Type t1 = getChild(0).getType().getNumResultType();
- Type t2 = getChild(1).getType().getNumResultType();
- // Find result type of this operator
- Type commonType = Type.INVALID;
- String fnName = op.getName();
- switch (op) {
- case MULTIPLY:
- case ADD:
- case SUBTRACT:
- case MOD:
- // numeric ops must be promoted to highest-resolution type
- // (otherwise we can't guarantee that a <op> b won't overflow/underflow)
- commonType = findCommonType(t1, t2);
- break;
- case DIVIDE:
- commonType = findCommonType(t1, t2);
- if (commonType.getPrimitiveType() == PrimitiveType.BIGINT
- || commonType.getPrimitiveType() == PrimitiveType.LARGEINT) {
- commonType = Type.DOUBLE;
+ if (fn == null) {
+ Preconditions.checkState(false, String.format(
+ "No match for vec function '%s' with operand types %s and %s", toSql(), t1, t2));
+ }
+ type = fn.getReturnType();
+ } else {
+ // bitnot is the only unary op, deal with it here
+ if (op == Operator.BITNOT) {
+ type = Type.BIGINT;
+ if (getChild(0).getType().getPrimitiveType() != PrimitiveType.BIGINT) {
+ castChild(type, 0);
}
- break;
- case INT_DIVIDE:
- case BITAND:
- case BITOR:
- case BITXOR:
- // Must be bigint
- commonType = Type.BIGINT;
- break;
- default:
- // the programmer forgot to deal with a case
- Preconditions.checkState(false,
- "Unknown arithmetic operation " + op.toString() + " in: " + this.toSql());
- break;
- }
-
- type = castBinaryOp(commonType);
- fn = getBuiltinFunction(analyzer, fnName, collectChildReturnTypes(),
- Function.CompareMode.IS_IDENTICAL);
- if (fn == null) {
- Preconditions.checkState(false, String.format(
- "No match for '%s' with operand types %s and %s", toSql(), t1, t2));
+ fn = getBuiltinFunction(
+ analyzer, op.getName(), collectChildReturnTypes(), Function.CompareMode.IS_SUPERTYPE_OF);
+ if (fn == null) {
+ Preconditions.checkState(false, String.format("No match for op with operand types", toSql()));
+ }
+ return;
+ }
+ analyzeSubqueryInChildren();
+ // if children has subquery, it will be rewritten and reanalyzed in the future.
+ if (contains(Subquery.class)) {
+ return;
+ }
+ Type t1 = getChild(0).getType().getNumResultType();
+ Type t2 = getChild(1).getType().getNumResultType();
+ // Find result type of this operator
+ Type commonType = Type.INVALID;
+ String fnName = op.getName();
+ switch (op) {
+ case MULTIPLY:
+ case ADD:
+ case SUBTRACT:
+ case MOD:
+ // numeric ops must be promoted to highest-resolution type
+ // (otherwise we can't guarantee that a <op> b won't overflow/underflow)
+ commonType = findCommonType(t1, t2);
+ break;
+ case DIVIDE:
+ commonType = findCommonType(t1, t2);
+ if (commonType.getPrimitiveType() == PrimitiveType.BIGINT
+ || commonType.getPrimitiveType() == PrimitiveType.LARGEINT) {
+ commonType = Type.DOUBLE;
+ }
+ break;
+ case INT_DIVIDE:
+ case BITAND:
+ case BITOR:
+ case BITXOR:
+ // Must be bigint
+ commonType = Type.BIGINT;
+ break;
+ default:
+ // the programmer forgot to deal with a case
+ Preconditions.checkState(false,
+ "Unknown arithmetic operation " + op.toString() + " in: " + this.toSql());
+ break;
+ }
+ type = castBinaryOp(commonType);
+ fn = getBuiltinFunction(analyzer, fnName, collectChildReturnTypes(),
+ Function.CompareMode.IS_IDENTICAL);
+ if (fn == null) {
+ Preconditions.checkState(false, String.format(
+ "No match for '%s' with operand types %s and %s", toSql(), t1, t2));
+ }
}
}
@@ -304,4 +382,5 @@ public class ArithmeticExpr extends Expr {
public int hashCode() {
return 31 * super.hashCode() + Objects.hashCode(op);
}
+
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 038a00e..6d51339 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -170,19 +170,19 @@ public class BinaryPredicate extends Predicate implements Writable {
public static void initBuiltins(FunctionSet functionSet) {
for (Type t: Type.getSupportedTypes()) {
if (t.isNull()) continue; // NULL is handled through type promotion.
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.EQ.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.NE.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.LE.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.GE.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.LT.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.GT.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
Operator.EQ_FOR_NULL.getName(), Lists.newArrayList(t, t), Type.BOOLEAN));
}
}
@@ -650,4 +650,12 @@ public class BinaryPredicate extends Predicate implements Writable {
public int hashCode() {
return 31 * super.hashCode() + Objects.hashCode(op);
}
+
+ @Override
+ public boolean isNullable() {
+ if (op == Operator.EQ_FOR_NULL) {
+ return false;
+ }
+ return hasNullableChild();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
index 34a1442..950ad95 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
@@ -375,4 +375,31 @@ public class CaseExpr extends Expr {
return false;
}
+ @Override
+ public boolean isNullable() {
+ int loopStart;
+ int loopEnd = children.size();
+ if (hasCaseExpr) {
+ loopStart = 2;
+ } else {
+ loopStart = 1;
+ }
+ if (hasElseExpr) {
+ --loopEnd;
+ }
+ for (int i = loopStart; i < loopEnd; i += 2) {
+ Expr thenExpr = children.get(i);
+ if (thenExpr.isNullable()) {
+ return true;
+ }
+ }
+ if (hasElseExpr) {
+ if (children.get(children.size() - 1).isNullable()) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ return false;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index dfdc4b0..ca46025 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -17,6 +17,9 @@
package org.apache.doris.analysis;
+import java.util.Arrays;
+import java.util.Map;
+
import org.apache.doris.catalog.Catalog;
import org.apache.doris.catalog.Function;
import org.apache.doris.catalog.FunctionSet;
@@ -25,6 +28,7 @@ import org.apache.doris.catalog.ScalarFunction;
import org.apache.doris.catalog.ScalarType;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.Pair;
import org.apache.doris.thrift.TExpr;
import org.apache.doris.thrift.TExprNode;
import org.apache.doris.thrift.TExprNodeType;
@@ -32,10 +36,12 @@ import org.apache.doris.thrift.TExprOpcode;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+
public class CastExpr extends Expr {
private static final Logger LOG = LogManager.getLogger(CastExpr.class);
@@ -48,6 +54,29 @@ public class CastExpr extends Expr {
// True if this cast does not change the type.
private boolean noOp = false;
+ private static final Map<Pair<Type, Type>, Function.NullableMode> TYPE_NULLABLE_MODE;
+
+ static {
+ TYPE_NULLABLE_MODE = Maps.newHashMap();
+ for (ScalarType fromType: Type.getSupportedTypes()) {
+ if (fromType.isNull()) {
+ continue;
+ }
+ for (ScalarType toType: Type.getSupportedTypes()) {
+ if (fromType.isNull()) {
+ continue;
+ }
+ if (fromType.isStringType() && !toType.isStringType()) {
+ TYPE_NULLABLE_MODE.put(new Pair<>(fromType, toType), Function.NullableMode.ALWAYS_NULLABLE);
+ } else if (!fromType.isDateType() && toType.isDateType()) {
+ TYPE_NULLABLE_MODE.put(new Pair<>(fromType, toType), Function.NullableMode.ALWAYS_NULLABLE);
+ } else {
+ TYPE_NULLABLE_MODE.put(new Pair<>(fromType, toType), Function.NullableMode.DEPEND_ON_ARGUMENT);
+ }
+ }
+ }
+ }
+
public CastExpr(Type targetType, Expr e) {
super();
Preconditions.checkArgument(targetType.isValid());
@@ -120,8 +149,10 @@ public class CastExpr extends Expr {
}
String beSymbol = "doris::" + beClass + "::cast_to_"
+ typeName;
- functionSet.addBuiltin(ScalarFunction.createBuiltin(getFnName(toType),
- Lists.newArrayList(fromType), false, toType, beSymbol, null, null, true));
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltin(getFnName(toType),
+ toType, TYPE_NULLABLE_MODE.get(new Pair<>(fromType, toType)),
+ Lists.newArrayList(fromType), false ,
+ beSymbol, null, null, true));
}
}
}
@@ -186,7 +217,7 @@ public class CastExpr extends Expr {
this.opcode = TExprOpcode.CAST;
FunctionName fnName = new FunctionName(getFnName(type));
- Function searchDesc = new Function(fnName, collectChildReturnTypes(), Type.INVALID, false);
+ Function searchDesc = new Function(fnName, Arrays.asList(collectChildReturnTypes()), Type.INVALID, false);
if (isImplicit) {
fn = Catalog.getCurrentCatalog().getFunction(
searchDesc, Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
index 499ab91..bda3233 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
@@ -17,6 +17,9 @@
package org.apache.doris.analysis;
+import com.google.common.collect.Lists;
+import org.apache.doris.catalog.FunctionSet;
+import org.apache.doris.catalog.ScalarFunction;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.thrift.TExprNode;
@@ -38,6 +41,15 @@ public class CompoundPredicate extends Predicate {
private final static Logger LOG = LogManager.getLogger(CompoundPredicate.class);
private final Operator op;
+ public static void initBuiltins(FunctionSet functionSet) {
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
+ Operator.AND.toString(), Lists.newArrayList(Type.BOOLEAN, Type.BOOLEAN), Type.BOOLEAN));
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
+ Operator.OR.toString(), Lists.newArrayList(Type.BOOLEAN, Type.BOOLEAN), Type.BOOLEAN));
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
+ Operator.NOT.toString(), Lists.newArrayList(Type.BOOLEAN), Type.BOOLEAN));
+ }
+
public CompoundPredicate(Operator op, Expr e1, Expr e2) {
super();
this.op = op;
@@ -227,4 +239,9 @@ public class CompoundPredicate extends Predicate {
public int hashCode() {
return 31 * super.hashCode() + Objects.hashCode(op);
}
+
+ @Override
+ public boolean isNullable() {
+ return hasNullableChild();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index c1475cf..a939aad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -28,18 +28,13 @@ import org.apache.doris.thrift.TDateLiteral;
import org.apache.doris.thrift.TExprNode;
import org.apache.doris.thrift.TExprNodeType;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDateTime;
-import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.DateTimeFormatterBuilder;
-
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
@@ -52,6 +47,12 @@ import java.util.Objects;
import java.util.TimeZone;
import java.util.regex.Pattern;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
+
public class DateLiteral extends LiteralExpr {
private static final Logger LOG = LogManager.getLogger(DateLiteral.class);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index 6b29f8d..8c932ae 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -27,6 +27,7 @@ import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.Config;
import org.apache.doris.common.TreeNode;
import org.apache.doris.common.io.Writable;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.thrift.TExpr;
import org.apache.doris.thrift.TExprNode;
import org.apache.doris.thrift.TExprOpcode;
@@ -47,6 +48,7 @@ import java.io.DataOutput;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -899,6 +901,10 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
return result;
}
+ public void setFn(Function fn) {
+ this.fn = fn;
+ }
+
// Append a flattened version of this expr, including all children, to 'container'.
protected void treeToThriftHelper(TExpr container) {
TExprNode msg = new TExprNode();
@@ -911,6 +917,7 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
}
}
msg.output_scale = getOutputScale();
+ msg.setIsNullable(isNullable());
toThrift(msg);
container.addToNodes(msg);
for (Expr child : children) {
@@ -1555,7 +1562,8 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
Analyzer analyzer, String name, Type[] argTypes, Function.CompareMode mode)
throws AnalysisException {
FunctionName fnName = new FunctionName(name);
- Function searchDesc = new Function(fnName, argTypes, Type.INVALID, false);
+ Function searchDesc = new Function(fnName, Arrays.asList(argTypes), Type.INVALID, false,
+ VectorizedUtil.isVectorized());
Function f = Catalog.getCurrentCatalog().getFunction(searchDesc, mode);
if (f != null && fnName.getFunction().equalsIgnoreCase("rand")) {
if (this.children.size() == 1
@@ -1820,4 +1828,64 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
return false;
}
+ protected boolean hasNullableChild() {
+ for (Expr expr : children) {
+ if (expr.isNullable()) return true;
+ }
+ return false;
+ }
+
+ /**
+ * For excute expr the result is nullable
+ * TODO: Now only SlotRef and LiteralExpr overwrite the method, each child of Expr should
+ * overwrite this method to plan correct
+ */
+ public boolean isNullable() {
+ if (fn == null) {
+ return true;
+ }
+ switch (fn.getNullableMode()) {
+ case DEPEND_ON_ARGUMENT:
+ return hasNullableChild();
+ case ALWAYS_NOT_NULLABLE:
+ return false;
+ case CUSTOM:
+ return customNullableAlgorithm();
+ case ALWAYS_NULLABLE:
+ default:
+ return true;
+ }
+ }
+
+ private boolean customNullableAlgorithm() {
+ Preconditions.checkState(fn.getNullableMode() == Function.NullableMode.CUSTOM);
+ if (fn.functionName().equalsIgnoreCase("if")) {
+ Preconditions.checkState(children.size() == 3);
+ for (int i = 1; i < children.size(); i++) {
+ if (children.get(i).isNullable()) {
+ return true;
+ }
+ }
+ return false;
+ }
+ if (fn.functionName().equalsIgnoreCase("ifnull")) {
+ Preconditions.checkState(children.size() == 2);
+ if (children.get(0).isNullable()) {
+ return children.get(1).isNullable();
+ }
+ return false;
+ }
+ if (fn.functionName().equalsIgnoreCase("coalesce")) {
+ for (Expr expr : children) {
+ if (!expr.isNullable()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (fn.functionName().equalsIgnoreCase("concat_ws")) {
+ return children.get(0).isNullable();
+ }
+ return true;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
index 55f0f64..2d2708a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
@@ -76,7 +76,8 @@ public enum ExpressionFunctions {
// 1. Not UDF
// 2. Not in NonNullResultWithNullParamFunctions
// 3. Has null parameter
- if (!Catalog.getCurrentCatalog().isNonNullResultWithNullParamFunction(fn.getFunctionName().getFunction())
+ if ((fn.getNullableMode() == Function.NullableMode.DEPEND_ON_ARGUMENT
+ || Catalog.getCurrentCatalog().isNullResultWithOneNullParamFunction(fn.getFunctionName().getFunction()))
&& !fn.isUdf()) {
for (Expr e : constExpr.getChildren()) {
if (e instanceof NullLiteral) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index bda3af9..3fdc919 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -30,6 +30,7 @@ import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.thrift.TAggregateExpr;
@@ -50,6 +51,7 @@ import org.apache.logging.log4j.Logger;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
+import java.util.Arrays;
import java.util.List;
// TODO: for aggregations, we need to unify the code paths for builtins and UDAs.
@@ -579,7 +581,11 @@ public class FunctionCallExpr extends Expr {
if (this.children.isEmpty()) {
throw new AnalysisException("The " + fnName + " function must has one input param");
}
- Type type = getChild(0).type.getMaxResolutionType();
+ // Prevent the cast type in vector exec engine
+ Type type = getChild(0).type;
+ if (!VectorizedUtil.isVectorized()) {
+ type = getChild(0).type.getMaxResolutionType();
+ }
fn = getBuiltinFunction(analyzer, fnName.getFunction(), new Type[]{type},
Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
} else if (fnName.getFunction().equalsIgnoreCase("count_distinct")) {
@@ -620,7 +626,7 @@ public class FunctionCallExpr extends Expr {
Database db = Catalog.getCurrentCatalog().getDb(dbName);
if (db != null) {
Function searchDesc = new Function(
- fnName, collectChildReturnTypes(), Type.INVALID, false);
+ fnName, Arrays.asList(collectChildReturnTypes()), Type.INVALID, false);
fn = db.getFunction(searchDesc, Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
index e684aa2..0edd1a0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
@@ -68,19 +68,19 @@ public class InPredicate extends Predicate {
String typeString = Function.getUdfTypeName(t.getPrimitiveType());
functionSet.addBuiltin(ScalarFunction.createBuiltin(IN_ITERATE,
- Lists.newArrayList(t, t), true, Type.BOOLEAN,
+ Type.BOOLEAN, Lists.newArrayList(t, t), true,
"doris::InPredicate::in_iterate", null, null, false));
functionSet.addBuiltin(ScalarFunction.createBuiltin(NOT_IN_ITERATE,
- Lists.newArrayList(t, t), true, Type.BOOLEAN,
+ Type.BOOLEAN, Lists.newArrayList(t, t), true,
"doris::InPredicate::not_in_iterate", null, null, false));
String prepareFn = "doris::InPredicate::set_lookup_prepare_" + typeString;
String closeFn = "doris::InPredicate::set_lookup_close_" + typeString;
functionSet.addBuiltin(ScalarFunction.createBuiltin(IN_SET_LOOKUP,
- Lists.newArrayList(t, t), true, Type.BOOLEAN,
+ Type.BOOLEAN, Lists.newArrayList(t, t), true,
"doris::InPredicate::in_set_lookup", prepareFn, closeFn, false));
functionSet.addBuiltin(ScalarFunction.createBuiltin(NOT_IN_SET_LOOKUP,
- Lists.newArrayList(t, t), true, Type.BOOLEAN,
+ Type.BOOLEAN, Lists.newArrayList(t, t), true,
"doris::InPredicate::not_in_set_lookup", prepareFn, closeFn, false));
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java
index 4e3cb88..a498e36 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java
@@ -266,9 +266,8 @@ public class InlineViewRef extends TableRef {
}
columnSet.add(colAlias);
- // TODO: inlineView threat all column is nullable to make sure query results are correct
- // we should judge column whether is nullable by selectItemExpr in the future
- columnList.add(new Column(colAlias, selectItemExpr.getType().getPrimitiveType(), true));
+ columnList.add(new Column(colAlias, selectItemExpr.getType().getPrimitiveType(),
+ selectItemExpr.isNullable()));
}
InlineView inlineView = (view != null) ? new InlineView(view, columnList) : new InlineView(getExplicitAlias(), columnList);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
index 740ea36..862ac9a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
@@ -48,11 +48,11 @@ public class IsNullPredicate extends Predicate {
"EEENS2_10BooleanValEPNS2_15FunctionContextERKT_";
}
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
IS_NULL, isNullSymbol, Lists.newArrayList(t), Type.BOOLEAN));
String isNotNullSymbol = isNullSymbol.replace("7is_null", "11is_not_null");
- functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
+ functionSet.addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltinOperator(
IS_NOT_NULL, isNotNullSymbol, Lists.newArrayList(t), Type.BOOLEAN));
}
}
@@ -128,4 +128,8 @@ public class IsNullPredicate extends Predicate {
return new IsNullPredicate(getChild(0), !isNotNull);
}
+ @Override
+ public boolean isNullable() {
+ return false;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
index c480323..f25b3ea 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
@@ -17,10 +17,6 @@
package org.apache.doris.analysis;
-import java.util.Objects;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
import org.apache.doris.catalog.Function;
import org.apache.doris.catalog.FunctionSet;
import org.apache.doris.catalog.ScalarFunction;
@@ -32,6 +28,10 @@ import org.apache.doris.thrift.TExprNodeType;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
public class LikePredicate extends Predicate {
public enum Operator {
@@ -52,14 +52,14 @@ public class LikePredicate extends Predicate {
public static void initBuiltins(FunctionSet functionSet) {
functionSet.addBuiltin(ScalarFunction.createBuiltin(
- Operator.LIKE.name(), Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR),
- false, Type.BOOLEAN,
+ Operator.LIKE.name(), Type.BOOLEAN, Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR),
+ false,
"_ZN5doris13LikePredicate4likeEPN9doris_udf15FunctionContextERKNS1_9StringValES6_",
"_ZN5doris13LikePredicate12like_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE",
"_ZN5doris13LikePredicate10like_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE", true));
functionSet.addBuiltin(ScalarFunction.createBuiltin(
- Operator.REGEXP.name(), Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR),
- false, Type.BOOLEAN,
+ Operator.REGEXP.name(), Type.BOOLEAN, Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR),
+ false,
"_ZN5doris13LikePredicate5regexEPN9doris_udf15FunctionContextERKNS1_9StringValES6_",
"_ZN5doris13LikePredicate13regex_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE",
"_ZN5doris13LikePredicate11regex_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE", true));
@@ -140,4 +140,5 @@ public class LikePredicate extends Predicate {
public int hashCode() {
return 31 * super.hashCode() + Objects.hashCode(op);
}
+
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java
index 6a8622d..1665a4b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java
@@ -229,5 +229,10 @@ public abstract class LiteralExpr extends Expr implements Comparable<LiteralExpr
}
return this.compareLiteral(((LiteralExpr) obj)) == 0;
}
+
+ @Override
+ public boolean isNullable() {
+ return this instanceof NullLiteral;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java
index 8803bd0..8081ff5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java
@@ -222,6 +222,7 @@ public class SlotDescriptor {
* Initializes a slot by setting its source expression information
*/
public void initFromExpr(Expr expr) {
+ setIsNullable(expr.isNullable());
setLabel(expr.toSql());
Preconditions.checkState(sourceExprs_.isEmpty());
setSourceExpr(expr);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index cd52ef6..006beff 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -401,4 +401,9 @@ public class SlotRef extends Expr {
slotRef.readFields(in);
return slotRef;
}
+
+ @Override
+ public boolean isNullable() {
+ return desc.getIsNullable();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
index ff3cae0..04fcff2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
@@ -20,6 +20,7 @@ package org.apache.doris.catalog;
import static org.apache.doris.common.io.IOUtils.readOptionStringOrNull;
import static org.apache.doris.common.io.IOUtils.writeOptionString;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import org.apache.doris.analysis.CreateFunctionStmt;
@@ -35,19 +36,21 @@ import org.apache.logging.log4j.Logger;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
-// import org.apache.doris.analysis.String;
-
/**
* Internal representation of an aggregate function.
* TODO: Create separate AnalyticFunction class
*/
public class AggregateFunction extends Function {
-
+
private static final Logger LOG = LogManager.getLogger(AggregateFunction.class);
+
+ public static ImmutableSet<String> NOT_NULLABLE_AGGREGATE_FUNCTION_NAME_SET =
+ ImmutableSet.of(FunctionSet.COUNT, "ndv", FunctionSet.BITMAP_UNION_INT, FunctionSet.BITMAP_UNION_COUNT, "ndv_no_finalize");
+
// Set if different from retType_, null otherwise.
private Type intermediateType;
@@ -90,30 +93,22 @@ public class AggregateFunction extends Function {
protected AggregateFunction() {
}
- public AggregateFunction(FunctionName fnName, ArrayList<Type> argTypes, Type retType,
- boolean hasVarArgs) {
- super(fnName, argTypes, retType, hasVarArgs);
+ public AggregateFunction(FunctionName fnName, List<Type> argTypes,
+ Type retType, Type intermediateType,
+ HdfsURI location, String updateFnSymbol, String initFnSymbol,
+ String serializeFnSymbol, String mergeFnSymbol, String getValueFnSymbol,
+ String removeFnSymbol, String finalizeFnSymbol) {
+ this(fnName, argTypes, retType, intermediateType, location, updateFnSymbol, initFnSymbol, serializeFnSymbol,
+ mergeFnSymbol, getValueFnSymbol, removeFnSymbol, finalizeFnSymbol, false);
}
public AggregateFunction(FunctionName fnName, List<Type> argTypes,
- Type retType, Type intermediateType,
- HdfsURI location, String updateFnSymbol, String initFnSymbol,
- String serializeFnSymbol, String mergeFnSymbol, String getValueFnSymbol,
- String removeFnSymbol, String finalizeFnSymbol) {
- super(fnName, argTypes, retType, false);
- setLocation(location);
- this.intermediateType = (intermediateType.equals(retType)) ? null : intermediateType;
- this.updateFnSymbol = updateFnSymbol;
- this.initFnSymbol = initFnSymbol;
- this.serializeFnSymbol = serializeFnSymbol;
- this.mergeFnSymbol = mergeFnSymbol;
- this.getValueFnSymbol = getValueFnSymbol;
- this.removeFnSymbol = removeFnSymbol;
- this.finalizeFnSymbol = finalizeFnSymbol;
- ignoresDistinct = false;
- isAnalyticFn = false;
- isAggregateFn = true;
- returnsNonNullOnEmpty = false;
+ Type retType, Type intermediateType,
+ HdfsURI location, String updateFnSymbol, String initFnSymbol,
+ String serializeFnSymbol, String mergeFnSymbol, String getValueFnSymbol,
+ String removeFnSymbol, String finalizeFnSymbol, boolean vectorized) {
+ this(fnName, argTypes, retType, intermediateType, false, location, updateFnSymbol, initFnSymbol, serializeFnSymbol,
+ mergeFnSymbol, getValueFnSymbol, removeFnSymbol, finalizeFnSymbol, vectorized);
}
public AggregateFunction(FunctionName fnName, List<Type> argTypes,
@@ -121,7 +116,18 @@ public class AggregateFunction extends Function {
HdfsURI location, String updateFnSymbol, String initFnSymbol,
String serializeFnSymbol, String mergeFnSymbol, String getValueFnSymbol,
String removeFnSymbol, String finalizeFnSymbol) {
- super(fnName, argTypes, retType, hasVarArgs);
+ this(fnName, argTypes, retType, intermediateType, hasVarArgs, location, updateFnSymbol, initFnSymbol, serializeFnSymbol,
+ mergeFnSymbol, getValueFnSymbol, removeFnSymbol, finalizeFnSymbol, false);
+ }
+
+ public AggregateFunction(FunctionName fnName, List<Type> argTypes,
+ Type retType, Type intermediateType, boolean hasVarArgs,
+ HdfsURI location, String updateFnSymbol, String initFnSymbol,
+ String serializeFnSymbol, String mergeFnSymbol, String getValueFnSymbol,
+ String removeFnSymbol, String finalizeFnSymbol, boolean vectorized) {
+ // only `count` is always not nullable, other aggregate function is always nullable
+ super(fnName, argTypes, retType, hasVarArgs, vectorized,
+ AggregateFunction.NOT_NULLABLE_AGGREGATE_FUNCTION_NAME_SET.contains(fnName.getFunction()) ? NullableMode.ALWAYS_NOT_NULLABLE : NullableMode.DEPEND_ON_ARGUMENT);
setLocation(location);
this.intermediateType = (intermediateType.equals(retType)) ? null : intermediateType;
this.updateFnSymbol = updateFnSymbol;
@@ -138,25 +144,46 @@ public class AggregateFunction extends Function {
}
public static AggregateFunction createBuiltin(String name,
- List<Type> argTypes, Type retType, Type intermediateType,
- String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
- String serializeFnSymbol, String finalizeFnSymbol, boolean ignoresDistinct,
- boolean isAnalyticFn, boolean returnsNonNullOnEmpty) {
+ List<Type> argTypes, Type retType, Type intermediateType,
+ String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
+ String serializeFnSymbol, String finalizeFnSymbol, boolean ignoresDistinct,
+ boolean isAnalyticFn, boolean returnsNonNullOnEmpty) {
+ return createBuiltin(name, argTypes, retType, intermediateType,
+ initFnSymbol, updateFnSymbol, mergeFnSymbol,
+ serializeFnSymbol, finalizeFnSymbol, ignoresDistinct, isAnalyticFn, returnsNonNullOnEmpty, false);
+ }
+ public static AggregateFunction createBuiltin(String name,
+ List<Type> argTypes, Type retType, Type intermediateType,
+ String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
+ String serializeFnSymbol, String finalizeFnSymbol, boolean ignoresDistinct,
+ boolean isAnalyticFn, boolean returnsNonNullOnEmpty, boolean vectorized) {
return createBuiltin(name, argTypes, retType, intermediateType, initFnSymbol,
- updateFnSymbol, mergeFnSymbol, serializeFnSymbol, null, null, finalizeFnSymbol,
- ignoresDistinct, isAnalyticFn, returnsNonNullOnEmpty);
+ updateFnSymbol, mergeFnSymbol, serializeFnSymbol, null, null, finalizeFnSymbol,
+ ignoresDistinct, isAnalyticFn, returnsNonNullOnEmpty, vectorized);
}
public static AggregateFunction createBuiltin(String name,
- List<Type> argTypes, Type retType, Type intermediateType,
- String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
- String serializeFnSymbol, String getValueFnSymbol, String removeFnSymbol,
- String finalizeFnSymbol, boolean ignoresDistinct, boolean isAnalyticFn,
- boolean returnsNonNullOnEmpty) {
+ List<Type> argTypes, Type retType, Type intermediateType,
+ String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
+ String serializeFnSymbol, String getValueFnSymbol, String removeFnSymbol,
+ String finalizeFnSymbol, boolean ignoresDistinct, boolean isAnalyticFn,
+ boolean returnsNonNullOnEmpty) {
+ return createBuiltin(name, argTypes, retType, intermediateType,
+ initFnSymbol, updateFnSymbol, mergeFnSymbol,
+ serializeFnSymbol, getValueFnSymbol, removeFnSymbol,
+ finalizeFnSymbol, ignoresDistinct, isAnalyticFn, returnsNonNullOnEmpty, false);
+ }
+
+ public static AggregateFunction createBuiltin(String name,
+ List<Type> argTypes, Type retType, Type intermediateType,
+ String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
+ String serializeFnSymbol, String getValueFnSymbol, String removeFnSymbol,
+ String finalizeFnSymbol, boolean ignoresDistinct, boolean isAnalyticFn,
+ boolean returnsNonNullOnEmpty, boolean vectorized) {
return createBuiltin(name, argTypes, retType, intermediateType, false,
initFnSymbol, updateFnSymbol, mergeFnSymbol,
serializeFnSymbol, getValueFnSymbol, removeFnSymbol,
- finalizeFnSymbol, ignoresDistinct, isAnalyticFn,returnsNonNullOnEmpty);
+ finalizeFnSymbol, ignoresDistinct, isAnalyticFn, returnsNonNullOnEmpty, vectorized);
}
public static AggregateFunction createBuiltin(String name,
@@ -165,10 +192,21 @@ public class AggregateFunction extends Function {
String serializeFnSymbol, String getValueFnSymbol, String removeFnSymbol,
String finalizeFnSymbol, boolean ignoresDistinct, boolean isAnalyticFn,
boolean returnsNonNullOnEmpty) {
+ return createBuiltin(name, argTypes, retType, intermediateType, hasVarArgs, initFnSymbol, updateFnSymbol,
+ mergeFnSymbol, serializeFnSymbol, getValueFnSymbol, removeFnSymbol, finalizeFnSymbol, ignoresDistinct,
+ isAnalyticFn, returnsNonNullOnEmpty, false);
+ }
+
+ public static AggregateFunction createBuiltin(String name,
+ List<Type> argTypes, Type retType, Type intermediateType, boolean hasVarArgs,
+ String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
+ String serializeFnSymbol, String getValueFnSymbol, String removeFnSymbol,
+ String finalizeFnSymbol, boolean ignoresDistinct, boolean isAnalyticFn,
+ boolean returnsNonNullOnEmpty, boolean vectorized) {
AggregateFunction fn = new AggregateFunction(new FunctionName(name),
argTypes, retType, intermediateType, hasVarArgs, null, updateFnSymbol, initFnSymbol,
serializeFnSymbol, mergeFnSymbol, getValueFnSymbol, removeFnSymbol,
- finalizeFnSymbol);
+ finalizeFnSymbol, vectorized);
fn.setBinaryType(TFunctionBinaryType.BUILTIN);
fn.ignoresDistinct = ignoresDistinct;
fn.isAnalyticFn = isAnalyticFn;
@@ -214,7 +252,7 @@ public class AggregateFunction extends Function {
String initFnSymbol, String updateFnSymbol, String mergeFnSymbol,
String serializeFnSymbol, String finalizeFnSymbol,
String getValueFnSymbol, String removeFnSymbol) {
- super(fnName, argTypes, retType, hasVarArgs);
+ super(fnName, Arrays.asList(argTypes), retType, hasVarArgs);
this.setLocation(new HdfsURI(location));
this.intermediateType = (intermediateType.equals(retType)) ? null : intermediateType;
this.updateFnSymbol = updateFnSymbol;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
index 86e2832..35c5d62 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
@@ -234,14 +234,10 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Queues;
import com.google.common.collect.Sets;
-import com.sleepycat.je.rep.InsufficientLogException;
-import com.sleepycat.je.rep.NetworkRestore;
-import com.sleepycat.je.rep.NetworkRestoreConfig;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.codehaus.jackson.map.ObjectMapper;
import java.io.BufferedReader;
import java.io.DataInputStream;
@@ -268,6 +264,11 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
+import com.sleepycat.je.rep.InsufficientLogException;
+import com.sleepycat.je.rep.NetworkRestore;
+import com.sleepycat.je.rep.NetworkRestoreConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+
public class Catalog {
private static final Logger LOG = LogManager.getLogger(Catalog.class);
// 0 ~ 9999 used for qe
@@ -5750,8 +5751,8 @@ public class Catalog {
return functionSet.getBulitinFunctions();
}
- public boolean isNonNullResultWithNullParamFunction(String funcName) {
- return functionSet.isNonNullResultWithNullParamFunctions(funcName);
+ public boolean isNullResultWithOneNullParamFunction(String funcName) {
+ return functionSet.isNullResultWithOneNullParamFunctions(funcName);
}
public boolean isNondeterministicFunction(String funcName) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
index 6013c93..122f061 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
@@ -82,6 +82,18 @@ public class Function implements Writable {
IS_MATCHABLE
}
+ public enum NullableMode {
+ // Whether output column is nullable is depend on the input column is nullable
+ DEPEND_ON_ARGUMENT,
+ // like 'str_to_date', 'cast', 'date_format' etc, the output column is nullable
+ // depend on input content
+ ALWAYS_NULLABLE,
+ // like 'count', the output column is always not nullable
+ ALWAYS_NOT_NULLABLE,
+ // Whether output column is nullable is depend on custom algorithm by @Expr.isNullable()
+ CUSTOM
+ }
+
public static final long UNIQUE_FUNCTION_ID = 0;
// Function id, every function has a unique id. Now all built-in functions' id is 0
private long id = 0;
@@ -104,6 +116,10 @@ public class Function implements Writable {
private HdfsURI location;
private TFunctionBinaryType binaryType;
+ protected NullableMode nullableMode = NullableMode.DEPEND_ON_ARGUMENT;
+
+ private boolean vectorized = false;
+
// library's checksum to make sure all backends use one library to serve user's request
protected String checksum = "";
@@ -111,33 +127,38 @@ public class Function implements Writable {
protected Function() {
}
- public Function(FunctionName name, Type[] argTypes, Type retType, boolean varArgs) {
- this(0, name, argTypes, retType, varArgs);
+ public Function(FunctionName name, List<Type> args, Type retType, boolean varArgs) {
+ this(0, name, args, retType, varArgs, false, NullableMode.DEPEND_ON_ARGUMENT);
}
- public Function(FunctionName name, List<Type> args, Type retType, boolean varArgs) {
- this(0, name, args, retType, varArgs);
+ public Function(FunctionName name, List<Type> args, Type retType, boolean varArgs, boolean vectorized) {
+ this(0, name, args, retType, varArgs, vectorized, NullableMode.DEPEND_ON_ARGUMENT);
}
- public Function(long id, FunctionName name, Type[] argTypes, Type retType, boolean hasVarArgs) {
+ public Function(FunctionName name, List<Type> args, Type retType, boolean varArgs, boolean vectorized, NullableMode mode) {
+ this(0, name, args, retType, varArgs, vectorized, mode);
+ }
+
+ public Function(long id, FunctionName name, List<Type> argTypes, Type retType, boolean hasVarArgs,
+ TFunctionBinaryType binaryType, boolean userVisible, boolean vectorized, NullableMode mode) {
this.id = id;
this.name = name;
this.hasVarArgs = hasVarArgs;
- if (argTypes == null) {
- this.argTypes = new Type[0];
- } else {
- this.argTypes = argTypes;
- }
- this.retType = retType;
- }
-
- public Function(long id, FunctionName name, List<Type> argTypes, Type retType, boolean hasVarArgs) {
- this(id, name, (Type[]) null, retType, hasVarArgs);
if (argTypes.size() > 0) {
this.argTypes = argTypes.toArray(new Type[argTypes.size()]);
} else {
this.argTypes = new Type[0];
}
+ this.retType = retType;
+ this.binaryType = binaryType;
+ this.userVisible = userVisible;
+ this.vectorized = vectorized;
+ this.nullableMode = mode;
+ }
+
+ public Function(long id, FunctionName name, List<Type> argTypes, Type retType,
+ boolean hasVarArgs, boolean vectorized, NullableMode mode) {
+ this(id, name, argTypes, retType, hasVarArgs, TFunctionBinaryType.BUILTIN, true, vectorized, mode);
}
public FunctionName getFunctionName() {
@@ -438,6 +459,7 @@ public class Function implements Writable {
if (!checksum.isEmpty()) {
fn.setChecksum(checksum);
}
+ fn.setVectorized(vectorized);
return fn;
}
@@ -701,4 +723,12 @@ public class Function implements Writable {
}
return row;
}
+
+ boolean isVectorized() {
+ return vectorized;
+ }
+
+ public NullableMode getNullableMode() {
+ return nullableMode;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
index 4dacd6a..64cb354 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
@@ -17,9 +17,11 @@
package org.apache.doris.catalog;
+import com.google.common.base.Preconditions;
import org.apache.doris.analysis.ArithmeticExpr;
import org.apache.doris.analysis.BinaryPredicate;
import org.apache.doris.analysis.CastExpr;
+import org.apache.doris.analysis.CompoundPredicate;
import org.apache.doris.analysis.InPredicate;
import org.apache.doris.analysis.IsNullPredicate;
import org.apache.doris.analysis.LikePredicate;
@@ -39,7 +41,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-public class FunctionSet {
+public class FunctionSet<min_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_> {
private static final Logger LOG = LogManager.getLogger(FunctionSet.class);
// All of the registered user functions. The key is the user facing name (e.g. "myUdf"),
@@ -48,7 +50,7 @@ public class FunctionSet {
// on this map. Functions are sorted in a canonical order defined by
// FunctionResolutionOrder.
private final HashMap<String, List<Function>> functions;
-
+ private final HashMap<String, List<Function>> vectorizedFunctions;
// For most build-in functions, it will return NullLiteral when params contain NullLiteral.
// But a few functions need to handle NullLiteral differently, such as "if". It need to add
// an attribute to LiteralExpr to mark null and check the attribute to decide whether to
@@ -56,14 +58,14 @@ public class FunctionSet {
// Functions in this set is defined in `gensrc/script/doris_builtins_functions.py`,
// and will be built automatically.
- // cmy: This does not contain any user defined functions. All UDFs handle null values by themselves.
- private ImmutableSet<String> nonNullResultWithNullParamFunctions;
+ private ImmutableSet<String> nullResultWithOneNullParamFunctions;
// Including now(), curdate(), etc..
private ImmutableSet<String> nondeterministicFunctions;
public FunctionSet() {
functions = Maps.newHashMap();
+ vectorizedFunctions = Maps.newHashMap();
}
public void init() {
@@ -72,7 +74,9 @@ public class FunctionSet {
ArithmeticExpr.initBuiltins(this);
BinaryPredicate.initBuiltins(this);
+ CompoundPredicate.initBuiltins(this);
CastExpr.initBuiltins(this);
+
IsNullPredicate.initBuiltins(this);
ScalarBuiltins.initBuiltins(this);
LikePredicate.initBuiltins(this);
@@ -80,12 +84,12 @@ public class FunctionSet {
AliasFunction.initBuiltins(this);
}
- public void buildNonNullResultWithNullParamFunction(Set<String> funcNames) {
+ public void buildNullResultWithOneNullParamFunction(Set<String> funcNames) {
ImmutableSet.Builder<String> setBuilder = new ImmutableSet.Builder<String>();
for (String funcName : funcNames) {
setBuilder.add(funcName);
}
- this.nonNullResultWithNullParamFunctions = setBuilder.build();
+ this.nullResultWithOneNullParamFunctions = setBuilder.build();
}
public void buildNondeterministicFunctions(Set<String> funcNames) {
@@ -96,15 +100,74 @@ public class FunctionSet {
this.nondeterministicFunctions = setBuilder.build();
}
-
- public boolean isNonNullResultWithNullParamFunctions(String funcName) {
- return nonNullResultWithNullParamFunctions.contains(funcName);
- }
-
public boolean isNondeterministicFunction(String funcName) {
return nondeterministicFunctions.contains(funcName);
}
+ public boolean isNullResultWithOneNullParamFunctions(String funcName) {
+ return nullResultWithOneNullParamFunctions.contains(funcName);
+ }
+
+ private static final Map<Type, String> MIN_INIT_SYMBOL =
+ ImmutableMap.<Type, String>builder()
+ .put(Type.BOOLEAN,
+ "8min_initIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.TINYINT,
+ "8min_initIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.SMALLINT,
+ "8min_initIN9doris_udf11SmallIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.INT,
+ "8min_initIN9doris_udf6IntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.BIGINT,
+ "8min_initIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.FLOAT,
+ "8min_initIN9doris_udf8FloatValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DOUBLE,
+ "8min_initIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextEPT_")
+ // .put(Type.CHAR,
+ // "3minIN9doris_udf9StringValEEEvPNS2_15FunctionContextERKT_PS6_")
+ .put(Type.VARCHAR,
+ "8min_initIN9doris_udf9StringValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DATE,
+ "8min_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DATETIME,
+ "8min_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DECIMALV2,
+ "8min_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.LARGEINT,
+ "8min_initIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_")
+ .build();
+
+ private static final Map<Type, String> MAX_INIT_SYMBOL =
+ ImmutableMap.<Type, String>builder()
+ .put(Type.BOOLEAN,
+ "8max_initIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.TINYINT,
+ "8max_initIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.SMALLINT,
+ "8max_initIN9doris_udf11SmallIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.INT,
+ "8max_initIN9doris_udf6IntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.BIGINT,
+ "8max_initIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.FLOAT,
+ "8max_initIN9doris_udf8FloatValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DOUBLE,
+ "8max_initIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextEPT_")
+ // .put(Type.CHAR,
+ // "3minIN9doris_udf9StringValEEEvPNS2_15FunctionContextERKT_PS6_")
+ .put(Type.VARCHAR,
+ "8max_initIN9doris_udf9StringValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DATE,
+ "8max_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DATETIME,
+ "8max_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.DECIMALV2,
+ "8max_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
+ .put(Type.LARGEINT,
+ "8max_initIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_")
+ .build();
+
private static final Map<Type, String> MIN_UPDATE_SYMBOL =
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
@@ -875,7 +938,7 @@ public class FunctionSet {
.build();
public Function getFunction(Function desc, Function.CompareMode mode) {
- List<Function> fns = functions.get(desc.functionName());
+ List<Function> fns = desc.isVectorized() ? vectorizedFunctions.get(desc.functionName()) : functions.get(desc.functionName());
if (fns == null) {
return null;
}
@@ -945,8 +1008,8 @@ public class FunctionSet {
return true;
}
- public Function getFunction(String signatureString) {
- for (List<Function> fns : functions.values()) {
+ public Function getFunction(String signatureString, boolean vectorized) {
+ for (List<Function> fns : vectorized ? vectorizedFunctions.values() : functions.values()) {
for (Function f : fns) {
if (f.signatureString().equals(signatureString)) {
return f;
@@ -961,38 +1024,45 @@ public class FunctionSet {
if (getFunction(fn, Function.CompareMode.IS_INDISTINGUISHABLE) != null) {
return false;
}
- List<Function> fns = functions.get(fn.functionName());
+ List<Function> fns = fn.isVectorized() ? vectorizedFunctions.get(fn.functionName()) : functions.get(fn.functionName());
if (fns == null) {
fns = Lists.newArrayList();
- functions.put(fn.functionName(), fns);
- }
- if (fns.add(fn)) {
- return true;
+ if (fn.isVectorized()) {
+ vectorizedFunctions.put(fn.functionName(), fns);
+ } else {
+ functions.put(fn.functionName(), fns);
+ }
}
- return false;
- }
-
- /**
- * Add a builtin with the specified name and signatures to this
- * This defaults to not using a Prepare/Close function.
- */
- public void addScalarBuiltin(String fnName, String symbol, boolean userVisible,
- boolean varArgs, PrimitiveType retType, PrimitiveType ... args) {
- addScalarBuiltin(fnName, symbol, userVisible, null, null, varArgs, retType, args);
+ fns.add(fn);
+ return true;
}
/**
* Add a builtin with the specified name and signatures to this db.
*/
public void addScalarBuiltin(String fnName, String symbol, boolean userVisible,
- String prepareFnSymbol, String closeFnSymbol, boolean varArgs,
- PrimitiveType retType, PrimitiveType ... args) {
+ String prepareFnSymbol, String closeFnSymbol,
+ Function.NullableMode nullableMode, PrimitiveType retType,
+ boolean varArgs, PrimitiveType ... args) {
ArrayList<Type> argsType = new ArrayList<Type>();
for (PrimitiveType type : args) {
argsType.add(Type.fromPrimitiveType(type));
}
addBuiltin(ScalarFunction.createBuiltin(
- fnName, argsType, varArgs, Type.fromPrimitiveType(retType),
+ fnName, Type.fromPrimitiveType(retType), nullableMode, argsType, varArgs,
+ symbol, prepareFnSymbol, closeFnSymbol, userVisible));
+ }
+
+ public void addScalarAndVectorizedBuiltin(String fnName, String symbol, boolean userVisible,
+ String prepareFnSymbol, String closeFnSymbol,
+ Function.NullableMode nullableMode, PrimitiveType retType,
+ boolean varArgs, PrimitiveType ... args) {
+ ArrayList<Type> argsType = new ArrayList<Type>();
+ for (PrimitiveType type : args) {
+ argsType.add(Type.fromPrimitiveType(type));
+ }
+ addBuiltinBothScalaAndVectorized(ScalarFunction.createBuiltin(
+ fnName, Type.fromPrimitiveType(retType), nullableMode, argsType, varArgs,
symbol, prepareFnSymbol, closeFnSymbol, userVisible));
}
@@ -1003,6 +1073,37 @@ public class FunctionSet {
addFunction(fn, true);
}
+ /**
+ * Adds a function both in FunctionSet and VecFunctionSet to this database.
+ * The function must not already exist and need to be not vectorized
+ */
+ public void addBuiltinBothScalaAndVectorized(Function fn) {
+ if (getFunction(fn, Function.CompareMode.IS_INDISTINGUISHABLE) != null) {
+ return;
+ }
+ Preconditions.checkState(!fn.isVectorized());
+
+ // add scala function
+ List<Function> fns = functions.get(fn.functionName());
+ if (fns == null) {
+ fns = Lists.newArrayList();
+ functions.put(fn.functionName(), fns);
+ }
+ fns.add(fn);
+
+ // add vectorized function
+ List<Function> vecFns = vectorizedFunctions.get(fn.functionName());
+ if (vecFns == null) {
+ vecFns = Lists.newArrayList();
+ vectorizedFunctions.put(fn.functionName(), vecFns);
+ }
+ ScalarFunction scalarFunction = (ScalarFunction)fn;
+ vecFns.add(ScalarFunction.createVecBuiltin(scalarFunction.functionName(), scalarFunction.getSymbolName(),
+ Lists.newArrayList(scalarFunction.getArgs()), scalarFunction.hasVarArgs(),
+ scalarFunction.getReturnType(), scalarFunction.isUserVisible(), scalarFunction.getNullableMode()));
+ }
+
+
public static final String COUNT = "count";
// Populate all the aggregate builtins in the catalog.
// null symbols indicate the function does not need that step of the evaluation.
@@ -1021,12 +1122,21 @@ public class FunctionSet {
// count(*)
addBuiltin(AggregateFunction.createBuiltin(FunctionSet.COUNT,
new ArrayList<Type>(), Type.BIGINT, Type.BIGINT,
- prefix + "9init_zeroIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
+ prefix + "18init_zero_not_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
prefix + "17count_star_updateEPN9doris_udf15FunctionContextEPNS1_9BigIntValE",
prefix + "11count_mergeEPN9doris_udf15FunctionContextERKNS1_9BigIntValEPS4_",
null, null,
prefix + "17count_star_removeEPN9doris_udf15FunctionContextEPNS1_9BigIntValE",
null, false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin(FunctionSet.COUNT,
+ new ArrayList<Type>(), Type.BIGINT, Type.BIGINT,
+ prefix + "18init_zero_not_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
+ prefix + "17count_star_updateEPN9doris_udf15FunctionContextEPNS1_9BigIntValE",
+ prefix + "11count_mergeEPN9doris_udf15FunctionContextERKNS1_9BigIntValEPS4_",
+ null, null,
+ prefix + "17count_star_removeEPN9doris_udf15FunctionContextEPNS1_9BigIntValE",
+ null, false, true, true, true));
for (Type t : Type.getSupportedTypes()) {
if (t.isNull()) {
@@ -1038,12 +1148,21 @@ public class FunctionSet {
// Count
addBuiltin(AggregateFunction.createBuiltin(FunctionSet.COUNT,
Lists.newArrayList(t), Type.BIGINT, Type.BIGINT,
- prefix + "9init_zeroIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
+ prefix + "18init_zero_not_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
prefix + "12count_updateEPN9doris_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
prefix + "11count_mergeEPN9doris_udf15FunctionContextERKNS1_9BigIntValEPS4_",
null, null,
prefix + "12count_removeEPN9doris_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
null, false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin(FunctionSet.COUNT,
+ Lists.newArrayList(t), Type.BIGINT, Type.BIGINT,
+ prefix + "18init_zero_not_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
+ prefix + "12count_updateEPN9doris_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
+ prefix + "11count_mergeEPN9doris_udf15FunctionContextERKNS1_9BigIntValEPS4_",
+ null, null,
+ prefix + "12count_removeEPN9doris_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
+ null, false, true, true, true));
// count in multi distinct
if (t.equals(Type.CHAR) || t.equals(Type.VARCHAR)) {
@@ -1058,6 +1177,18 @@ public class FunctionSet {
null,
prefix + "30count_distinct_string_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
+ Type.BIGINT,
+ Type.VARCHAR,
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ null,
+ null,
+ prefix + "",
+ false, true, true, true));
} else if (t.equals(Type.TINYINT) || t.equals(Type.SMALLINT) || t.equals(Type.INT)
|| t.equals(Type.BIGINT) || t.equals(Type.LARGEINT) || t.equals(Type.DOUBLE)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
@@ -1071,6 +1202,20 @@ public class FunctionSet {
null,
prefix + MULTI_DISTINCT_COUNT_FINALIZE_SYMBOL.get(t),
false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
+ Type.BIGINT,
+ t,
+ prefix + MULTI_DISTINCT_INIT_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_UPDATE_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_MERGE_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_SERIALIZE_SYMBOL.get(t),
+ null,
+ null,
+ prefix + MULTI_DISTINCT_COUNT_FINALIZE_SYMBOL.get(t),
+ false, true, true, true));
+
+
} else if (t.equals(Type.DATE) || t.equals(Type.DATETIME)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
Type.BIGINT,
@@ -1083,6 +1228,8 @@ public class FunctionSet {
null,
prefix + "28count_distinct_date_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, true));
+ // vectorized
+ // now we don't support datetime distinct
} else if (t.equals(Type.DECIMALV2)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
Type.BIGINT,
@@ -1095,6 +1242,18 @@ public class FunctionSet {
null,
prefix + "33count_distinct_decimalv2_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
+ Type.BIGINT,
+ Type.DECIMALV2,
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ null,
+ null,
+ prefix + "",
+ false, true, true, true));
}
// sum in multi distinct
@@ -1110,7 +1269,20 @@ public class FunctionSet {
null,
prefix + MULTI_DISTINCT_SUM_FINALIZE_SYMBOL.get(t),
false, true, true));
- } else if (t.equals(Type.DECIMALV2)) {
+
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t),
+ t,
+ Type.BIGINT,
+ prefix + MULTI_DISTINCT_INIT_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_UPDATE_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_MERGE_SYMBOL.get(t),
+ prefix + MULTI_DISTINCT_SERIALIZE_SYMBOL.get(t),
+ null,
+ null,
+ prefix + MULTI_DISTINCT_SUM_FINALIZE_SYMBOL.get(t),
+ false, true, true, true));
+ } else if (t.equals(Type.DECIMALV2)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t),
MULTI_DISTINCT_SUM_RETURN_TYPE.get(t),
Type.VARCHAR,
@@ -1122,25 +1294,50 @@ public class FunctionSet {
null,
prefix + "31sum_distinct_decimalv2_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t),
+ MULTI_DISTINCT_SUM_RETURN_TYPE.get(t),
+ Type.DECIMALV2,
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ prefix + "",
+ null,
+ null,
+ prefix + "",
+ false, true, true, true));
}
// Min
- String minMaxInit = t.isStringType() ? initNullString : initNull;
String minMaxSerializeOrFinalize = t.isStringType() ? stringValSerializeOrFinalize : null;
String minMaxGetValue = t.isStringType() ? stringValGetValue : null;
addBuiltin(AggregateFunction.createBuiltin("min",
- Lists.newArrayList(t), t, t, minMaxInit,
+ Lists.newArrayList(t), t, t, prefix + MIN_INIT_SYMBOL.get(t),
prefix + MIN_UPDATE_SYMBOL.get(t),
prefix + MIN_UPDATE_SYMBOL.get(t),
minMaxSerializeOrFinalize, minMaxGetValue,
null, minMaxSerializeOrFinalize, true, true, false));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("min",
+ Lists.newArrayList(t), t, t, prefix + MIN_INIT_SYMBOL.get(t),
+ prefix + MIN_UPDATE_SYMBOL.get(t),
+ prefix + MIN_UPDATE_SYMBOL.get(t),
+ minMaxSerializeOrFinalize, minMaxGetValue,
+ null, minMaxSerializeOrFinalize, true, true, false, true));
// Max
addBuiltin(AggregateFunction.createBuiltin("max",
- Lists.newArrayList(t), t, t, minMaxInit,
+ Lists.newArrayList(t), t, t, prefix + MAX_INIT_SYMBOL.get(t),
prefix + MAX_UPDATE_SYMBOL.get(t),
prefix + MAX_UPDATE_SYMBOL.get(t),
minMaxSerializeOrFinalize, minMaxGetValue,
null, minMaxSerializeOrFinalize, true, true, false));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin("max",
+ Lists.newArrayList(t), t, t, prefix + MAX_INIT_SYMBOL.get(t),
+ prefix + MAX_UPDATE_SYMBOL.get(t),
+ prefix + MAX_UPDATE_SYMBOL.get(t),
+ minMaxSerializeOrFinalize, minMaxGetValue,
+ null, minMaxSerializeOrFinalize, true, true, false, true));
// NDV
// ndv return string
@@ -1173,6 +1370,16 @@ public class FunctionSet {
"_ZN5doris15BitmapFunctions16bitmap_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
"_ZN5doris15BitmapFunctions15bitmap_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, false, true));
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin(BITMAP_UNION_INT,
+ Lists.newArrayList(t), Type.BIGINT, t,
+ "",
+ BITMAP_UNION_INT_SYMBOL.get(t),
+ "",
+ "",
+ "",
+ true, false, true, true));
+
// INTERSECT_COUNT
addBuiltin(AggregateFunction.createBuiltin(INTERSECT_COUNT,
@@ -1198,6 +1405,18 @@ public class FunctionSet {
"_ZN5doris12HllFunctions12hll_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, true, true));
+ // HLL_UNION_AGG vectorized
+ addBuiltin(AggregateFunction.createBuiltin("hll_union_agg",
+ Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR,
+ "_ZN5doris12HllFunctions8hll_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ HLL_UNION_AGG_UPDATE_SYMBOL.get(t),
+ "_ZN5doris12HllFunctions9hll_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ "_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ "_ZN5doris12HllFunctions13hll_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ null,
+ "_ZN5doris12HllFunctions12hll_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ true, true, true, true));
+
// HLL_UNION
addBuiltin(AggregateFunction.createBuiltin(HLL_UNION,
Lists.newArrayList(t), Type.HLL, Type.HLL,
@@ -1208,6 +1427,16 @@ public class FunctionSet {
"_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, false, true));
+ // HLL_UNION vectorized
+ addBuiltin(AggregateFunction.createBuiltin(HLL_UNION,
+ Lists.newArrayList(t), Type.HLL, Type.HLL,
+ "_ZN5doris12HllFunctions8hll_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ "_ZN5doris12HllFunctions9hll_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ "_ZN5doris12HllFunctions9hll_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ "_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ "_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ true, false, true, true));
+
// HLL_RAW_AGG is alias of HLL_UNION
addBuiltin(AggregateFunction.createBuiltin("hll_raw_agg",
Lists.newArrayList(t), Type.HLL, Type.HLL,
@@ -1218,6 +1447,16 @@ public class FunctionSet {
"_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, false, true));
+ // HLL_RAW_AGG is alias of HLL_UNION vectorized
+ addBuiltin(AggregateFunction.createBuiltin("hll_raw_agg",
+ Lists.newArrayList(t), Type.HLL, Type.HLL,
+ "_ZN5doris12HllFunctions8hll_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ "_ZN5doris12HllFunctions9hll_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ "_ZN5doris12HllFunctions9hll_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ "_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ "_ZN5doris12HllFunctions13hll_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ true, false, true, true));
+
// TopN
if (TOPN_UPDATE_SYMBOL.containsKey(t)) {
addBuiltin(AggregateFunction.createBuiltin("topn",
@@ -1311,33 +1550,84 @@ public class FunctionSet {
String []sumNames = {"sum", "sum_distinct"};
for (String name : sumNames) {
addBuiltin(AggregateFunction.createBuiltin(name,
- Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.BIGINT, initNull,
+ Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.BIGINT, prefix + "14init_zero_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
prefix + "10sum_removeIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false));
addBuiltin(AggregateFunction.createBuiltin(name,
- Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, Type.DOUBLE, initNull,
+ Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, Type.DOUBLE, prefix + "14init_zero_nullIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextEPT_",
prefix + "3sumIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
prefix + "10sum_removeIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false));
addBuiltin(AggregateFunction.createBuiltin(name,
- Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2, initNull,
+ Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2, prefix + "14init_zero_nullIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_",
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
prefix + "10sum_removeIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false));
addBuiltin(AggregateFunction.createBuiltin(name,
- Lists.<Type>newArrayList(Type.LARGEINT), Type.LARGEINT, Type.LARGEINT, initNull,
+ Lists.<Type>newArrayList(Type.LARGEINT), Type.LARGEINT, Type.LARGEINT, prefix + "14init_zero_nullIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_",
prefix + "3sumIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
prefix + "10sum_removeIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false));
+
+ // vectorized
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.TINYINT), Type.BIGINT, Type.BIGINT, initNull,
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.SMALLINT), Type.BIGINT, Type.BIGINT, initNull,
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.INT), Type.BIGINT, Type.BIGINT, initNull,
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.BIGINT, initNull,
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, Type.DOUBLE, initNull,
+ prefix + "3sumIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2, initNull,
+ prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(name,
+ Lists.<Type>newArrayList(Type.LARGEINT), Type.LARGEINT, Type.LARGEINT, initNull,
+ prefix + "3sumIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ prefix + "3sumIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, null,
+ prefix + "10sum_removeIN9doris_udf11LargeIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
+ null, false, true, false, true));
}
// bitmap
@@ -1351,6 +1641,17 @@ public class FunctionSet {
"_ZN5doris15BitmapFunctions16bitmap_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(BITMAP_UNION, Lists.newArrayList(Type.BITMAP),
+ Type.BITMAP,
+ Type.BITMAP,
+ "",
+ "",
+ "",
+ "",
+ "",
+ true, false, true, true));
+
+
addBuiltin(AggregateFunction.createBuiltin(BITMAP_UNION_COUNT, Lists.newArrayList(Type.BITMAP),
Type.BIGINT,
Type.VARCHAR,
@@ -1362,6 +1663,19 @@ public class FunctionSet {
null,
"_ZN5doris15BitmapFunctions15bitmap_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, true, true));
+
+ addBuiltin(AggregateFunction.createBuiltin(BITMAP_UNION_COUNT, Lists.newArrayList(Type.BITMAP),
+ Type.BIGINT,
+ Type.BITMAP,
+ "",
+ "",
+ "",
+ "",
+ "",
+ null,
+ "",
+ true, true, true, true));
+
// TODO(ml): supply function symbol
addBuiltin(AggregateFunction.createBuiltin(BITMAP_INTERSECT, Lists.newArrayList(Type.BITMAP),
Type.BITMAP, Type.VARCHAR,
@@ -1372,6 +1686,15 @@ public class FunctionSet {
"_ZN5doris15BitmapFunctions16bitmap_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin(BITMAP_INTERSECT, Lists.newArrayList(Type.BITMAP),
+ Type.BITMAP, Type.BITMAP,
+ "",
+ "",
+ "",
+ "",
+ "",
+ true, false, true, true));
+
//PercentileApprox
addBuiltin(AggregateFunction.createBuiltin("percentile_approx",
Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.VARCHAR,
@@ -1412,6 +1735,7 @@ public class FunctionSet {
prefix + "10avg_removeIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
prefix + "12avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, false));
+
addBuiltin(AggregateFunction.createBuiltin("avg",
Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.VARCHAR,
prefix + "18decimalv2_avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
@@ -1422,6 +1746,7 @@ public class FunctionSet {
prefix + "20decimalv2_avg_removeEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE",
prefix + "22decimalv2_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, false));
+
// Avg(Timestamp)
addBuiltin(AggregateFunction.createBuiltin("avg",
Lists.<Type>newArrayList(Type.DATE), Type.DATE, Type.VARCHAR,
@@ -1443,6 +1768,47 @@ public class FunctionSet {
prefix + "20timestamp_avg_removeEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
prefix + "22timestamp_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, false));
+ // vectorized avg
+ addBuiltin(AggregateFunction.createBuiltin("avg",
+ Lists.<Type>newArrayList(Type.BIGINT), Type.DOUBLE, Type.BIGINT,
+ prefix + "8avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ prefix + "10avg_updateIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
+ prefix + "9avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ stringValSerializeOrFinalize,
+ prefix + "13avg_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ prefix + "10avg_removeIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
+ prefix + "12avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin("avg",
+ Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, Type.DOUBLE,
+ prefix + "8avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ prefix + "10avg_updateIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
+ prefix + "9avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ stringValSerializeOrFinalize,
+ prefix + "13avg_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ prefix + "10avg_removeIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
+ prefix + "12avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin("avg",
+ Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2,
+ prefix + "18decimalv2_avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ prefix + "20decimalv2_avg_updateEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE",
+ prefix + "19decimalv2_avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ prefix + "23decimalv2_avg_serializeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ prefix + "23decimalv2_avg_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ prefix + "20decimalv2_avg_removeEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE",
+ prefix + "22decimalv2_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ false, true, false, true));
+ addBuiltin(AggregateFunction.createBuiltin("avg",
+ Lists.<Type>newArrayList(Type.DATE), Type.DATE, Type.DATE,
+ prefix + "8avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
+ prefix + "20timestamp_avg_updateEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
+ prefix + "9avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
+ stringValSerializeOrFinalize,
+ prefix + "23timestamp_avg_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ prefix + "20timestamp_avg_removeEPN9doris_udf15FunctionContextERKNS1_11DateTimeValEPNS1_9StringValE",
+ prefix + "22timestamp_avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
+ false, true, false, true));
// Group_concat(string)
addBuiltin(AggregateFunction.createBuiltin("group_concat",
Lists.<Type>newArrayList(Type.VARCHAR), Type.VARCHAR, Type.VARCHAR, initNullString,
@@ -1480,7 +1846,7 @@ public class FunctionSet {
prefix + "13rank_finalizeEPN9doris_udf15FunctionContextERNS1_9StringValE"));
addBuiltin(AggregateFunction.createAnalyticBuiltin( "row_number",
new ArrayList<Type>(), Type.BIGINT, Type.BIGINT,
- prefix + "9init_zeroIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
+ prefix + "18init_zero_not_nullIN9doris_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
prefix + "17count_star_updateEPN9doris_udf15FunctionContextEPNS1_9BigIntValE",
prefix + "11count_mergeEPN9doris_udf15FunctionContextERKNS1_9BigIntValEPS4_",
null, null));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
index b00febf..3f60a59 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
@@ -17,12 +17,6 @@
package org.apache.doris.catalog;
-import static org.apache.doris.common.io.IOUtils.writeOptionString;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gson.Gson;
import org.apache.doris.analysis.CreateFunctionStmt;
import org.apache.doris.analysis.FunctionName;
import org.apache.doris.analysis.HdfsURI;
@@ -30,6 +24,11 @@ import org.apache.doris.common.io.Text;
import org.apache.doris.thrift.TFunction;
import org.apache.doris.thrift.TFunctionBinaryType;
import org.apache.doris.thrift.TScalarFunction;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -37,9 +36,14 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import com.google.gson.Gson;
+
+import static org.apache.doris.common.io.IOUtils.writeOptionString;
+
// import org.apache.doris.thrift.TSymbolType;
/**
@@ -57,14 +61,19 @@ public class ScalarFunction extends Function {
protected ScalarFunction() {
}
- public ScalarFunction(
- FunctionName fnName, Type[] argTypes, Type retType, boolean hasVarArgs) {
- super(fnName, argTypes, retType, hasVarArgs);
+ public ScalarFunction(FunctionName fnName, List<Type> argTypes, Type retType, boolean hasVarArgs,
+ boolean userVisible) {
+ this(fnName, argTypes, retType, hasVarArgs, TFunctionBinaryType.BUILTIN, userVisible, false);
}
- public ScalarFunction(
- FunctionName fnName, ArrayList<Type> argTypes, Type retType, boolean hasVarArgs) {
- super(fnName, argTypes, retType, hasVarArgs);
+ public ScalarFunction(FunctionName fnName, List<Type> argTypes, Type retType, boolean hasVarArgs,
+ boolean userVisible, boolean isVec) {
+ this(fnName, argTypes, retType, hasVarArgs, TFunctionBinaryType.BUILTIN, userVisible, isVec);
+ }
+
+ public ScalarFunction(FunctionName fnName, List<Type> argTypes, Type retType, boolean hasVarArgs,
+ TFunctionBinaryType binaryType, boolean userVisible, boolean isVec) {
+ super(0, fnName, argTypes, retType, hasVarArgs, binaryType, userVisible, isVec, NullableMode.DEPEND_ON_ARGUMENT);
}
public ScalarFunction(FunctionName fnName, List<Type> argTypes,
@@ -81,48 +90,33 @@ public class ScalarFunction extends Function {
* Creates a builtin scalar function. This is a helper that wraps a few steps
* into one call.
*/
+ public static ScalarFunction createBuiltin(String name, Type retType,
+ ArrayList<Type> argTypes, boolean hasVarArgs,
+ String symbol, String prepareFnSymbol, String closeFnSymbol,
+ boolean userVisible) {
+ return createBuiltin(name, retType, NullableMode.DEPEND_ON_ARGUMENT, argTypes, hasVarArgs,
+ symbol, prepareFnSymbol, closeFnSymbol, userVisible);
+ }
+
public static ScalarFunction createBuiltin(
- String name, ArrayList<Type> argTypes,
- boolean hasVarArgs, Type retType, String symbol,
- String prepareFnSymbol, String closeFnSymbol, boolean userVisible) {
+ String name, Type retType, NullableMode nullableMode,
+ ArrayList<Type> argTypes, boolean hasVarArgs,
+ String symbol, String prepareFnSymbol, String closeFnSymbol, boolean userVisible) {
Preconditions.checkNotNull(symbol);
ScalarFunction fn = new ScalarFunction(
- new FunctionName(name), argTypes, retType, hasVarArgs);
- fn.setBinaryType(TFunctionBinaryType.BUILTIN);
- fn.setUserVisible(userVisible);
+ new FunctionName(name), argTypes, retType, hasVarArgs, userVisible);
fn.symbolName = symbol;
fn.prepareFnSymbol = prepareFnSymbol;
fn.closeFnSymbol = closeFnSymbol;
-
-///* try {
-// fn.symbolName = fn.lookupSymbol(symbol, TSymbolType.UDF_EVALUATE, null,
-// fn.hasVarArgs(), fn.getArgs());
-// } catch (AnalysisException e) {
-// // This should never happen
-// throw new RuntimeException("Builtin symbol '" + symbol + "'" + argTypes
-// + " not found!", e);
-// }
-// if (prepareFnSymbol != null) {
-// try {
-// fn.prepareFnSymbol = fn.lookupSymbol(prepareFnSymbol, TSymbolType.UDF_PREPARE);
-// } catch (AnalysisException e) {
-// // This should never happen
-// throw new RuntimeException(
-// "Builtin symbol '" + prepareFnSymbol + "' not found!", e);
-// }
-// }
-// if (closeFnSymbol != null) {
-// try {
-// fn.closeFnSymbol = fn.lookupSymbol(closeFnSymbol, TSymbolType.UDF_CLOSE);
-// } catch (AnalysisException e) {
-// // This should never happen
-// throw new RuntimeException(
-// "Builtin symbol '" + closeFnSymbol + "' not found!", e);
-// }
-// }*/
+ fn.nullableMode = nullableMode;
return fn;
}
+ public static ScalarFunction createBuiltinOperator(
+ String name, ArrayList<Type> argTypes, Type retType) {
+ return createBuiltinOperator(name, argTypes, retType, NullableMode.DEPEND_ON_ARGUMENT);
+ }
+
/**
* Creates a builtin scalar operator function. This is a helper that wraps a few steps
* into one call.
@@ -130,7 +124,7 @@ public class ScalarFunction extends Function {
* implementations. (gen_functions.py). Is there a better way to coordinate this.
*/
public static ScalarFunction createBuiltinOperator(
- String name, ArrayList<Type> argTypes, Type retType) {
+ String name, ArrayList<Type> argTypes, Type retType, NullableMode nullableMode) {
// Operators have a well defined symbol based on the function name and type.
// Convert Add(TINYINT, TINYINT) --> Add_TinyIntVal_TinyIntVal
String beFn = name;
@@ -184,22 +178,96 @@ public class ScalarFunction extends Function {
String beClass = usesDecimal ? "DecimalOperators" : "Operators";
if (usesDecimalV2) beClass = "DecimalV2Operators";
String symbol = "doris::" + beClass + "::" + beFn;
- return createBuiltinOperator(name, symbol, argTypes, retType);
+ return createBuiltinOperator(name, symbol, argTypes, retType, nullableMode);
+ }
+
+ public static ScalarFunction createVecBuiltinOperator(
+ String name, ArrayList<Type> argTypes, Type retType) {
+ return createVecBuiltinOperator(name, argTypes, retType, NullableMode.DEPEND_ON_ARGUMENT);
+ }
+
+ /**
+ * Creates a builtin scala vec operator function. This is a helper that wraps a few steps
+ * into one call.
+ * TODO: this needs to be kept in sync with what generates the be operator
+ * implementations. (gen_functions.py). Is there a better way to coordinate this.
+ */
+ public static ScalarFunction createVecBuiltinOperator(
+ String name, ArrayList<Type> argTypes, Type retType, NullableMode nullableMode) {
+ StringBuilder beFn = new StringBuilder(name);
+ boolean usesDecimal = false;
+ boolean usesDecimalV2 = false;
+
+ // just mock a fake symbol for vec function, we treat
+ // all argument is same as first argument
+ for (int i = 0; i < argTypes.size(); ++i) {
+ switch (argTypes.get(0).getPrimitiveType()) {
+ case BOOLEAN:
+ beFn.append("_boolean_val");
+ break;
+ case TINYINT:
+ beFn.append("_tiny_int_val");
+ break;
+ case SMALLINT:
+ beFn.append("_small_int_val");
+ break;
+ case INT:
+ beFn.append("_int_val");
+ break;
+ case BIGINT:
+ beFn.append("_big_int_val");
+ break;
+ case LARGEINT:
+ beFn.append("_large_int_val");
+ break;
+ case FLOAT:
+ beFn.append("_float_val");
+ break;
+ case DOUBLE:
+ case TIME:
+ beFn.append("_double_val");
+ break;
+ case CHAR:
+ case VARCHAR:
+ case HLL:
+ case BITMAP:
+ beFn.append("_string_val");
+ break;
+ case DATE:
+ case DATETIME:
+ beFn.append("_datetime_val");
+ break;
+ case DECIMALV2:
+ beFn.append("_decimalv2_val");
+ usesDecimalV2 = true;
+ break;
+ default:
+ Preconditions.checkState(false, "Argument type not supported: " + argTypes.get(i));
+ }
+ }
+ String beClass = usesDecimal ? "DecimalOperators" : "Operators";
+ if (usesDecimalV2) beClass = "DecimalV2Operators";
+ String symbol = "doris::" + beClass + "::" + beFn;
+ return createVecBuiltinOperator(name, symbol, argTypes, retType, nullableMode);
}
public static ScalarFunction createBuiltinOperator(
String name, String symbol, ArrayList<Type> argTypes, Type retType) {
- return createBuiltin(name, symbol, argTypes, false, retType, false);
+ return createBuiltinOperator(name, symbol, argTypes, retType, NullableMode.DEPEND_ON_ARGUMENT);
+ }
+
+ public static ScalarFunction createBuiltinOperator(
+ String name, String symbol, ArrayList<Type> argTypes, Type retType, NullableMode nullableMode) {
+ return createBuiltin(name, symbol, argTypes, false, retType, false, nullableMode);
}
public static ScalarFunction createBuiltin(
String name, String symbol, ArrayList<Type> argTypes,
- boolean hasVarArgs, Type retType, boolean userVisible) {
+ boolean hasVarArgs, Type retType, boolean userVisible, NullableMode nullableMode) {
ScalarFunction fn = new ScalarFunction(
- new FunctionName(name), argTypes, retType, hasVarArgs);
- fn.setBinaryType(TFunctionBinaryType.BUILTIN);
- fn.setUserVisible(userVisible);
+ new FunctionName(name), argTypes, retType, hasVarArgs, userVisible);
fn.symbolName = symbol;
+ fn.nullableMode = nullableMode;
// try {
// fn.symbolName_ = fn.lookupSymbol(symbol, TSymbolType.UDF_EVALUATE, null,
@@ -213,6 +281,22 @@ public class ScalarFunction extends Function {
return fn;
}
+ public static ScalarFunction createVecBuiltinOperator(
+ String name, String symbol, ArrayList<Type> argTypes, Type retType, NullableMode nullableMode) {
+ return createVecBuiltin(name, symbol, argTypes, false, retType, false, nullableMode);
+ }
+
+ //TODO: This method should not be here, move to other place in the future
+ public static ScalarFunction createVecBuiltin(
+ String name, String symbol, ArrayList<Type> argTypes,
+ boolean hasVarArgs, Type retType, boolean userVisible, NullableMode nullableMode) {
+ ScalarFunction fn = new ScalarFunction(
+ new FunctionName(name), argTypes, retType, hasVarArgs, userVisible, true);
+ fn.symbolName = symbol;
+ fn.nullableMode = nullableMode;
+ return fn;
+ }
+
/**
* Create a function that is used to search the catalog for a matching builtin. Only
* the fields necessary for matching function prototypes are specified.
@@ -222,8 +306,7 @@ public class ScalarFunction extends Function {
ArrayList<Type> fnArgs =
(argTypes == null) ? new ArrayList<Type>() : Lists.newArrayList(argTypes);
ScalarFunction fn = new ScalarFunction(
- new FunctionName(name), fnArgs, Type.INVALID, hasVarArgs);
- fn.setBinaryType(TFunctionBinaryType.BUILTIN);
+ new FunctionName(name), fnArgs, Type.INVALID, hasVarArgs, true);
return fn;
}
@@ -231,9 +314,8 @@ public class ScalarFunction extends Function {
FunctionName name, Type[] args,
Type returnType, boolean isVariadic,
String objectFile, String symbol, String prepareFnSymbol, String closeFnSymbol) {
- ScalarFunction fn = new ScalarFunction(name, args, returnType, isVariadic);
- fn.setBinaryType(TFunctionBinaryType.NATIVE);
- fn.setUserVisible(true);
+ ScalarFunction fn = new ScalarFunction(name, Arrays.asList(args), returnType, isVariadic,
+ TFunctionBinaryType.NATIVE, true, false);
fn.symbolName = symbol;
fn.prepareFnSymbol = prepareFnSymbol;
fn.closeFnSymbol = closeFnSymbol;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java
index 01c70c5..24782fc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java
@@ -56,6 +56,8 @@ public class ProfileTreeBuilder {
private static final String PROFILE_NAME_BUFFER_POOL = "Buffer pool";
private static final String PROFILE_NAME_EXCHANGE_NODE = "EXCHANGE_NODE";
public static final String FINAL_SENDER_ID = "-1";
+ private static final String PROFILE_NAME_VEXCHANGE_NODE = "VEXCHANGE_NODE";
+ public static final String DATA_BUFFER_SENDER_ID = "-1";
public static final String UNKNOWN_ID = "-2";
private RuntimeProfile profileRoot;
@@ -270,7 +272,8 @@ public class ProfileTreeBuilder {
node.setParentNode(root);
}
- if (node.name.equals(PROFILE_NAME_EXCHANGE_NODE) && instanceId == null) {
+ if ((node.name.equals(PROFILE_NAME_EXCHANGE_NODE) ||
+ node.name.equals(PROFILE_NAME_VEXCHANGE_NODE)) && instanceId == null) {
exchangeNodes.add(node);
}
diff --git a/gensrc/proto/data.proto b/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
similarity index 64%
copy from gensrc/proto/data.proto
copy to fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
index d380031..349cf1e 100644
--- a/gensrc/proto/data.proto
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
@@ -15,23 +15,16 @@
// specific language governing permissions and limitations
// under the License.
-syntax="proto2";
+package org.apache.doris.common.util;
-package doris;
-option java_package = "org.apache.doris.proto";
+import org.apache.doris.qe.ConnectContext;
-message PQueryStatistics {
- optional int64 scan_rows = 1;
- optional int64 scan_bytes = 2;
- optional int64 returned_rows = 3;
- optional int64 cpu_ms = 4;
+public class VectorizedUtil {
+ public static boolean isVectorized() {
+ if (ConnectContext.get() == null) {
+ return false;
+ }
+ return ConnectContext.get().getSessionVariable().enableVectorizedEngine();
+ }
}
-message PRowBatch {
- required int32 num_rows = 1;
- repeated int32 row_tuples = 2;
- repeated int32 tuple_offsets = 3;
- required bytes tuple_data = 4;
- required bool is_compressed = 5;
-};
-
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
index 667e34e..4b94a96 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
@@ -263,7 +263,6 @@ public class AggregationNode extends PlanNode {
@Override
protected void toThrift(TPlanNode msg) {
msg.node_type = TPlanNodeType.AGGREGATION_NODE;
-
List<TExpr> aggregateFunctions = Lists.newArrayList();
// only serialize agg exprs that are being materialized
for (FunctionCallExpr e: aggInfo.getMaterializedAggregateExprs()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
index e7b82c0..8b30ad4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
@@ -18,16 +18,22 @@
package org.apache.doris.planner;
import org.apache.doris.analysis.Analyzer;
+import org.apache.doris.analysis.CompoundPredicate;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.ExprId;
import org.apache.doris.analysis.ExprSubstitutionMap;
+import org.apache.doris.analysis.FunctionName;
import org.apache.doris.analysis.SlotId;
import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.analysis.TupleId;
+import org.apache.doris.catalog.Function;
+import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.TreeNode;
import org.apache.doris.common.UserException;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.thrift.TExplainLevel;
+import org.apache.doris.thrift.TFunctionBinaryType;
import org.apache.doris.thrift.TPlan;
import org.apache.doris.thrift.TPlanNode;
@@ -85,6 +91,8 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
protected List<Expr> conjuncts = Lists.newArrayList();
+ protected Expr vconjunct = null;
+
// Conjuncts used to filter the original load file.
// In the load execution plan, the difference between "preFilterConjuncts" and "conjuncts" is that
// conjuncts are used to filter the data after column conversion and mapping,
@@ -128,7 +136,8 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
this.tupleIds = Lists.newArrayList(tupleIds);
this.tblRefIds = Lists.newArrayList(tupleIds);
this.cardinality = -1;
- this.planNodeName = planNodeName;
+ this.planNodeName = VectorizedUtil.isVectorized() ?
+ "V" + planNodeName : planNodeName;
this.numInstances = 1;
}
@@ -138,7 +147,8 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
this.tupleIds = Lists.newArrayList();
this.tblRefIds = Lists.newArrayList();
this.cardinality = -1;
- this.planNodeName = planNodeName;
+ this.planNodeName = VectorizedUtil.isVectorized() ?
+ "V" + planNodeName : planNodeName;
this.numInstances = 1;
}
@@ -154,7 +164,8 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
this.conjuncts = Expr.cloneList(node.conjuncts, null);
this.cardinality = -1;
this.compactData = node.compactData;
- this.planNodeName = planNodeName;
+ this.planNodeName = VectorizedUtil.isVectorized() ?
+ "V" + planNodeName : planNodeName;
this.numInstances = 1;
}
@@ -286,6 +297,39 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
return conjuncts;
}
+ private void initCompoundPredicate(Expr expr) {
+ if (expr instanceof CompoundPredicate) {
+ CompoundPredicate compoundPredicate = (CompoundPredicate) expr;
+ compoundPredicate.setType(Type.BOOLEAN);
+ List<Type> args = new ArrayList<>();
+ args.add(Type.BOOLEAN);
+ args.add(Type.BOOLEAN);
+ Function function = new Function(new FunctionName("", compoundPredicate.getOp().toString()), args, Type.BOOLEAN, false);
+ function.setBinaryType(TFunctionBinaryType.BUILTIN);
+ expr.setFn(function);
+ }
+
+ for (Expr child : expr.getChildren()) {
+ initCompoundPredicate(child);
+ }
+ }
+
+ private Expr convertConjunctsToAndCompoundPredicate() {
+ List<Expr> targetConjuncts = Lists.newArrayList(conjuncts);
+ while (targetConjuncts.size() > 1) {
+ List<Expr> newTargetConjuncts = Lists.newArrayList();
+ for (int i = 0; i < targetConjuncts.size(); i+= 2) {
+ Expr expr = i + 1 < targetConjuncts.size() ? new CompoundPredicate(CompoundPredicate.Operator.AND, targetConjuncts.get(i),
+ targetConjuncts.get(i + 1)) : targetConjuncts.get(i);
+ newTargetConjuncts.add(expr);
+ }
+ targetConjuncts = newTargetConjuncts;
+ }
+
+ Preconditions.checkArgument(targetConjuncts.size() == 1);
+ return targetConjuncts.get(0);
+ }
+
public void addConjuncts(List<Expr> conjuncts) {
if (conjuncts == null) {
return;
@@ -429,10 +473,16 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
for (Expr e : conjuncts) {
msg.addToConjuncts(e.treeToThrift());
}
+
// Serialize any runtime filters
for (RuntimeFilter filter : runtimeFilters) {
msg.addToRuntimeFilters(filter.toThrift());
}
+
+ if (vconjunct != null) {
+ msg.vconjunct = vconjunct.treeToThrift();
+ }
+
msg.compact_data = compactData;
toThrift(msg);
container.addToNodes(msg);
@@ -802,4 +852,15 @@ abstract public class PlanNode extends TreeNode<PlanNode> {
sb.append("\n").append(getNodeExplainString("", TExplainLevel.BRIEF));
return sb.toString();
}
+
+ void convertToVectoriezd() {
+ if (!conjuncts.isEmpty()) {
+ vconjunct = convertConjunctsToAndCompoundPredicate();
+ initCompoundPredicate(vconjunct);
+ }
+
+ for (PlanNode child : children) {
+ child.convertToVectoriezd();
+ }
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java
index bb2efa4..3030351 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java
@@ -28,6 +28,7 @@ import org.apache.doris.analysis.SlotId;
import org.apache.doris.analysis.StatementBase;
import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.common.UserException;
import org.apache.doris.common.profile.PlanTreeBuilder;
import org.apache.doris.common.profile.PlanTreePrinter;
@@ -167,6 +168,10 @@ public class Planner {
singleNodePlanner = new SingleNodePlanner(plannerContext);
PlanNode singleNodePlan = singleNodePlanner.createSingleNodePlan();
+ if (VectorizedUtil.isVectorized()) {
+ singleNodePlan.convertToVectoriezd();
+ }
+
if (statement instanceof InsertStmt) {
InsertStmt insertStmt = (InsertStmt) statement;
insertStmt.prepareExpressions();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ResultSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ResultSink.java
index 547dfb3..ea91583 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ResultSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ResultSink.java
@@ -18,6 +18,7 @@
package org.apache.doris.planner;
import org.apache.doris.analysis.OutFileClause;
+import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.thrift.TDataSink;
import org.apache.doris.thrift.TDataSinkType;
import org.apache.doris.thrift.TExplainLevel;
@@ -49,7 +50,11 @@ public class ResultSink extends DataSink {
@Override
public String getExplainString(String prefix, TExplainLevel explainLevel) {
StringBuilder strBuilder = new StringBuilder();
- strBuilder.append(prefix + "RESULT SINK\n");
+ strBuilder.append(prefix);
+ if (VectorizedUtil.isVectorized()) {
+ strBuilder.append("V");
+ }
+ strBuilder.append("RESULT SINK\n");
return strBuilder.toString();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
index 801ba0a..f10e676 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
@@ -1670,8 +1670,8 @@ public class SingleNodePlanner {
switch (tblRef.getTable().getType()) {
case OLAP:
- OlapScanNode olapNode = new OlapScanNode(ctx_.getNextNodeId(), tblRef.getDesc(), "OlapScanNode");
-
+ OlapScanNode olapNode = new OlapScanNode(ctx_.getNextNodeId(), tblRef.getDesc(),
+ "OlapScanNode");
olapNode.setForceOpenPreAgg(tblRef.isForcePreAggOpened());
scanNode = olapNode;
break;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
index 9cefa7d..a3095bd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
@@ -452,6 +452,7 @@ public class Coordinator {
} else {
// This is a load process.
this.queryOptions.setIsReportSuccess(true);
+ this.queryOptions.setEnableVectorizedEngine(false);
deltaUrls = Lists.newArrayList();
loadCounters = Maps.newHashMap();
List<Long> relatedBackendIds = Lists.newArrayList(addressToBackendID.values());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 9818ab1..78698fb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -141,11 +141,14 @@ public class SessionVariable implements Serializable, Writable {
public static final String DELETE_WITHOUT_PARTITION = "delete_without_partition";
- public static final String EXTRACT_WIDE_RANGE_EXPR = "extract_wide_range_expr";
-
public static final long DEFAULT_INSERT_VISIBLE_TIMEOUT_MS = 10_000;
+
+ public static final String EXTRACT_WIDE_RANGE_EXPR = "extract_wide_range_expr";
+
public static final long MIN_INSERT_VISIBLE_TIMEOUT_MS = 1000; // If user set a very small value, use this value instead.
+ public static final String ENABLE_VECTORIZED_ENGINE = "enable_vectorized_engine";
+
// session origin value
public Map<Field, String> sessionOriginValue = new HashMap<Field, String>();
// check stmt is or not [select /*+ SET_VAR(...)*/ ...]
@@ -355,6 +358,9 @@ public class SessionVariable implements Serializable, Writable {
@VariableMgr.VarAttr(name = RUNTIME_FILTER_MAX_IN_NUM)
private int runtimeFilterMaxInNum = 1024;
+ @VariableMgr.VarAttr(name = ENABLE_VECTORIZED_ENGINE)
+ public boolean enableVectorizedEngine = false;
+
public long getMaxExecMemByte() {
return maxExecMemByte;
}
@@ -699,6 +705,14 @@ public class SessionVariable implements Serializable, Writable {
this.runtimeFilterMaxInNum = runtimeFilterMaxInNum;
}
+ public boolean enableVectorizedEngine() {
+ return enableVectorizedEngine;
+ }
+
+ public void setEnableVectorizedEngine(boolean enableVectorizedEngine) {
+ this.enableVectorizedEngine = enableVectorizedEngine;
+ }
+
public long getInsertVisibleTimeoutMs() {
if (insertVisibleTimeoutMs < MIN_INSERT_VISIBLE_TIMEOUT_MS) {
return MIN_INSERT_VISIBLE_TIMEOUT_MS;
@@ -758,6 +772,7 @@ public class SessionVariable implements Serializable, Writable {
tResult.setQueryTimeout(queryTimeoutS);
tResult.setIsReportSuccess(isReportSucc);
tResult.setCodegenLevel(codegenLevel);
+ tResult.setEnableVectorizedEngine(enableVectorizedEngine);
tResult.setBatchSize(batchSize);
tResult.setDisableStreamPreaggregations(disableStreamPreaggregations);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index a2af4bc..49bd19d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -54,6 +54,7 @@ import org.apache.doris.catalog.Table;
import org.apache.doris.catalog.Table.TableType;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.AuditLog;
import org.apache.doris.common.Config;
import org.apache.doris.common.DdlException;
import org.apache.doris.common.ErrorCode;
@@ -332,7 +333,7 @@ public class StmtExecutor implements ProfileWriter {
if (i > 0) {
UUID uuid = UUID.randomUUID();
TUniqueId newQueryId = new TUniqueId(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
- LOG.warn("Query {} {} times with new query id: {}", DebugUtil.printId(queryId), i, DebugUtil.printId(newQueryId));
+ AuditLog.getQueryAudit().log("Query {} {} times with new query id: {}", DebugUtil.printId(queryId), i, DebugUtil.printId(newQueryId));
context.setQueryId(newQueryId);
}
handleQueryStmt();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CaseExprTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CaseExprTest.java
new file mode 100644
index 0000000..0d991b7
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CaseExprTest.java
@@ -0,0 +1,69 @@
+// 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.
+//
+
+package org.apache.doris.analysis;
+
+import java.util.List;
+
+import com.clearspring.analytics.util.Lists;
+import mockit.Expectations;
+import mockit.Injectable;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CaseExprTest {
+
+ @Test
+ public void testIsNullable(@Injectable Expr caseExpr,
+ @Injectable Expr whenExpr,
+ @Injectable Expr thenExpr,
+ @Injectable Expr elseExpr) {
+ // without case without else
+ CaseWhenClause caseWhenClause = new CaseWhenClause(whenExpr, thenExpr);
+ List<CaseWhenClause> caseWhenClauseList = Lists.newArrayList();
+ caseWhenClauseList.add(caseWhenClause);
+ CaseExpr caseExpr1 = new CaseExpr(null, caseWhenClauseList, null);
+ new Expectations() {
+ {
+ thenExpr.isNullable();
+ result = false;
+ }
+ };
+ Assert.assertTrue(caseExpr1.isNullable());
+ // with case without else
+ CaseExpr caseExpr2 = new CaseExpr(caseExpr, caseWhenClauseList, null);
+ new Expectations() {
+ {
+ thenExpr.isNullable();
+ result = false;
+ }
+ };
+ Assert.assertTrue(caseExpr2.isNullable());
+ // with case with else
+ CaseExpr caseExpr3 = new CaseExpr(caseExpr, caseWhenClauseList, elseExpr);
+ new Expectations() {
+ {
+ thenExpr.isNullable();
+ result = false;
+ elseExpr.isNullable();
+ result = true;
+ }
+ };
+ Assert.assertTrue(caseExpr3.isNullable());
+ }
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/FunctionSetTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/FunctionSetTest.java
index 2301a12..fbdb75e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/FunctionSetTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/FunctionSetTest.java
@@ -23,6 +23,8 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import java.util.Arrays;
+
public class FunctionSetTest {
private FunctionSet functionSet;
@@ -36,18 +38,18 @@ public class FunctionSetTest {
@Test
public void testGetLagFunction() {
Type[] argTypes1 = {ScalarType.DECIMALV2, ScalarType.TINYINT, ScalarType.TINYINT};
- Function lagDesc1 = new Function(new FunctionName("lag"), argTypes1, (Type) ScalarType.INVALID, false);
+ Function lagDesc1 = new Function(new FunctionName("lag"), Arrays.asList(argTypes1), (Type) ScalarType.INVALID, false);
Function newFunction = functionSet.getFunction(lagDesc1, Function.CompareMode.IS_SUPERTYPE_OF);
Type[] newArgTypes = newFunction.getArgs();
Assert.assertTrue(newArgTypes[0].matchesType(newArgTypes[2]));
Assert.assertTrue(newArgTypes[0].matchesType(ScalarType.DECIMALV2));
Type[] argTypes2 = {ScalarType.VARCHAR, ScalarType.TINYINT, ScalarType.TINYINT};
- Function lagDesc2 = new Function(new FunctionName("lag"), argTypes2, (Type) ScalarType.INVALID, false);
+ Function lagDesc2 = new Function(new FunctionName("lag"), Arrays.asList(argTypes2), (Type) ScalarType.INVALID, false);
newFunction = functionSet.getFunction(lagDesc2, Function.CompareMode.IS_SUPERTYPE_OF);
newArgTypes = newFunction.getArgs();
Assert.assertTrue(newArgTypes[0].matchesType(newArgTypes[2]));
Assert.assertTrue(newArgTypes[0].matchesType(ScalarType.VARCHAR));
}
-}
\ No newline at end of file
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
index 135a50b..b145917 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
@@ -327,7 +327,7 @@ public class PlannerTest {
Planner planner1 = stmtExecutor1.planner();
List<PlanFragment> fragments1 = planner1.getFragments();
String plan1 = planner1.getExplainString(fragments1, new ExplainOptions(true, false));
- Assert.assertEquals(3, StringUtils.countMatches(plan1, "nullIndicatorBit=0"));
+ Assert.assertEquals(2, StringUtils.countMatches(plan1, "nullIndicatorBit=0"));
}
@Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadScanNodeTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadScanNodeTest.java
index a7a07d0..28aafaf 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadScanNodeTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadScanNodeTest.java
@@ -340,7 +340,7 @@ public class StreamLoadScanNodeTest {
new Expectations() {{
catalog.getFunction((Function) any, (Function.CompareMode) any);
- result = new ScalarFunction(new FunctionName(FunctionSet.HLL_HASH), Lists.newArrayList(), Type.BIGINT, false);
+ result = new ScalarFunction(new FunctionName(FunctionSet.HLL_HASH), Lists.newArrayList(), Type.BIGINT, false, true);
}};
new Expectations() {
@@ -390,7 +390,7 @@ public class StreamLoadScanNodeTest {
new Expectations() {
{
catalog.getFunction((Function) any, (Function.CompareMode) any);
- result = new ScalarFunction(new FunctionName("hll_hash1"), Lists.newArrayList(), Type.BIGINT, false);
+ result = new ScalarFunction(new FunctionName("hll_hash1"), Lists.newArrayList(), Type.BIGINT, false, true);
minTimes = 0;
}
};
diff --git a/fe/fe-core/src/test/resources/log4j2.xml b/fe/fe-core/src/test/resources/log4j2.xml
index d0e6cba..7e0957b 100644
--- a/fe/fe-core/src/test/resources/log4j2.xml
+++ b/fe/fe-core/src/test/resources/log4j2.xml
@@ -16,7 +16,7 @@
</Appenders>
<Loggers>
- <Root level="debug">
+ <Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Root>
diff --git a/gensrc/proto/data.proto b/gensrc/proto/data.proto
index d380031..ca62757 100644
--- a/gensrc/proto/data.proto
+++ b/gensrc/proto/data.proto
@@ -33,5 +33,57 @@ message PRowBatch {
repeated int32 tuple_offsets = 3;
required bytes tuple_data = 4;
required bool is_compressed = 5;
-};
+}
+
+message PColumn {
+ enum DataType {
+ UINT8 = 0;
+ UINT16 = 1;
+ UINT32 = 2;
+ UINT64 = 3;
+ UINT128 = 4;
+ UINT256 = 5;
+ INT16 = 6;
+ INT8 = 7;
+ INT32 = 8;
+ INT64 = 9;
+ INT128 = 10;
+ INT256 = 11;
+ FLOAT32 = 12;
+ FLOAT64 = 13;
+ BOOLEAN = 14;
+ DATE = 15;
+ DATETIME = 16;
+ HLL = 17;
+ BITMAP = 18;
+ ARRAY = 19;
+ MAP = 20;
+ STRUCT =21;
+ STRING = 22;
+ DECIMAL32 = 23;
+ DECIMAL64 = 24;
+ DECIMAL128 = 25;
+ BYTES = 26;
+ NOTHING = 27;
+ UNKNOWN = 999;
+ }
+ message Decimal {
+ optional uint32 precision = 1;
+ optional uint32 scale = 2;
+ }
+ required string name = 1;
+ // origin column data_type
+ required DataType type = 2;
+ // serialized data type
+ repeated bool is_null = 3;
+ // store in plain text or in binary data
+ optional bytes binary = 4;
+ optional bool compressed = 5 [default = false];
+ optional Decimal decimal_param = 6;
+}
+message PBlock {
+ optional uint64 num_rows = 1;
+ optional uint32 num_columns = 2;
+ repeated PColumn columns = 3;
+}
diff --git a/gensrc/proto/internal_service.proto b/gensrc/proto/internal_service.proto
index b792fc0..381987e 100644
--- a/gensrc/proto/internal_service.proto
+++ b/gensrc/proto/internal_service.proto
@@ -43,6 +43,8 @@ message PTransmitDataParams {
// different per packet
required int64 packet_seq = 7;
optional PQueryStatistics query_statistics = 8;
+
+ optional PBlock block = 9;
};
message PTransmitDataResult {
@@ -395,5 +397,6 @@ service PBackendService {
rpc merge_filter(PMergeFilterRequest) returns (PMergeFilterResponse);
rpc apply_filter(PPublishFilterRequest) returns (PPublishFilterResponse);
rpc fold_constant_expr(PConstantExprRequest) returns (PConstantExprResult);
+ rpc transmit_block(PTransmitDataParams) returns (PTransmitDataResult);
};
diff --git a/gensrc/proto/palo_internal_service.proto b/gensrc/proto/palo_internal_service.proto
new file mode 100644
index 0000000..222fdf7
--- /dev/null
+++ b/gensrc/proto/palo_internal_service.proto
@@ -0,0 +1,47 @@
+// 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.
+
+// NOTE(XXX): DEPRECATED, just use to compatiple with old version.
+// Make system can grayscale upgrade
+syntax="proto2";
+
+import "internal_service.proto";
+
+package palo;
+option java_package = "org.apache.doris.proto";
+
+option cc_generic_services = true;
+
+service PInternalService {
+ rpc transmit_data(doris.PTransmitDataParams) returns (doris.PTransmitDataResult);
+ rpc exec_plan_fragment(doris.PExecPlanFragmentRequest) returns (doris.PExecPlanFragmentResult);
+ rpc cancel_plan_fragment(doris.PCancelPlanFragmentRequest) returns (doris.PCancelPlanFragmentResult);
+ rpc fetch_data(doris.PFetchDataRequest) returns (doris.PFetchDataResult);
+ rpc tablet_writer_open(doris.PTabletWriterOpenRequest) returns (doris.PTabletWriterOpenResult);
+ rpc tablet_writer_add_batch(doris.PTabletWriterAddBatchRequest) returns (doris.PTabletWriterAddBatchResult);
+ rpc tablet_writer_cancel(doris.PTabletWriterCancelRequest) returns (doris.PTabletWriterCancelResult);
+ rpc get_info(doris.PProxyRequest) returns (doris.PProxyResult);
+ rpc update_cache(doris.PUpdateCacheRequest) returns (doris.PCacheResponse);
+ rpc fetch_cache(doris.PFetchCacheRequest) returns (doris.PFetchCacheResult);
+ rpc clear_cache(doris.PClearCacheRequest) returns (doris.PCacheResponse);
+
+ rpc merge_filter(doris.PMergeFilterRequest) returns (doris.PMergeFilterResponse);
+ rpc apply_filter(doris.PPublishFilterRequest) returns (doris.PPublishFilterResponse);
+
+ rpc fold_constant_expr(doris.PConstantExprRequest) returns (doris.PConstantExprResult);
+ rpc transmit_block(doris.PTransmitDataParams) returns (doris.PTransmitDataResult);
+};
diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py
index 7979224..82536b3 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -24,11 +24,18 @@
# The format is:
# [sql aliases], <return_type>, [<args>], <backend symbol>,
# With an optional
-# <prepare symbol>, <close symbol>
+# <prepare symbol>, <close symbol>, <vec>, <nullable mode>
#
# 'sql aliases' are the function names that can be used from sql. There must be at least
# one per function.
#
+# 'vec' means that whether the vec engine support this function. There are two values of
+# this params: 'vec', ''. If the value is 'vec', it means both normal and vec engine support
+# this function. If the value is '', it means only normal engine support this function.
+#
+# 'nullable mode' reflects whether the return value of the function is null. See @Function.NullableMode
+# for the specific mode and meaning.
+#
# The symbol can be empty for functions that are not yet implemented or are special-cased
# in Expr::CreateExpr() (i.e., functions that are implemented via a custom Expr class
# rather than a single function).
@@ -37,856 +44,1031 @@ visible_functions = [
# For functions corresponding to builtin operators, we can reuse the implementations
[['bitand'], 'TINYINT', ['TINYINT', 'TINYINT'],
'_ZN5doris9Operators32bitand_tiny_int_val_tiny_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_10TinyIntValES6_'],
+ '15FunctionContextERKNS1_10TinyIntValES6_', '', '', '', ''],
[['bitand'], 'SMALLINT', ['SMALLINT', 'SMALLINT'],
'_ZN5doris9Operators34bitand_small_int_val_small_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11SmallIntValES6_'],
+ '15FunctionContextERKNS1_11SmallIntValES6_', '', '', '', ''],
[['bitand'], 'INT', ['INT', 'INT'],
'_ZN5doris9Operators22bitand_int_val_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_6IntValES6_', '', '', '', ''],
[['bitand'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris9Operators30bitand_big_int_val_big_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValES6_'],
+ '15FunctionContextERKNS1_9BigIntValES6_', '', '', '', ''],
[['bitand'], 'LARGEINT', ['LARGEINT', 'LARGEINT'],
'_ZN5doris9Operators34bitand_large_int_val_large_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11LargeIntValES6_'],
+ '15FunctionContextERKNS1_11LargeIntValES6_', '', '', '', ''],
[['bitor'], 'TINYINT', ['TINYINT', 'TINYINT'],
'_ZN5doris9Operators31bitor_tiny_int_val_tiny_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_10TinyIntValES6_'],
+ '15FunctionContextERKNS1_10TinyIntValES6_', '', '', '', ''],
[['bitor'], 'SMALLINT', ['SMALLINT', 'SMALLINT'],
'_ZN5doris9Operators33bitor_small_int_val_small_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11SmallIntValES6_'],
+ '15FunctionContextERKNS1_11SmallIntValES6_', '', '', '', ''],
[['bitor'], 'INT', ['INT', 'INT'],
'_ZN5doris9Operators21bitor_int_val_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_6IntValES6_', '', '', '', ''],
[['bitor'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris9Operators29bitor_big_int_val_big_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValES6_'],
+ '15FunctionContextERKNS1_9BigIntValES6_', '', '', '', ''],
[['bitor'], 'LARGEINT', ['LARGEINT', 'LARGEINT'],
'_ZN5doris9Operators33bitor_large_int_val_large_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11LargeIntValES6_'],
+ '15FunctionContextERKNS1_11LargeIntValES6_', '', '', '', ''],
[['bitxor'], 'TINYINT', ['TINYINT', 'TINYINT'],
'_ZN5doris9Operators32bitxor_tiny_int_val_tiny_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_10TinyIntValES6_'],
+ '15FunctionContextERKNS1_10TinyIntValES6_', '', '', '', ''],
[['bitxor'], 'SMALLINT', ['SMALLINT', 'SMALLINT'],
'_ZN5doris9Operators34bitxor_small_int_val_small_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11SmallIntValES6_'],
+ '15FunctionContextERKNS1_11SmallIntValES6_', '', '', '', ''],
[['bitxor'], 'INT', ['INT', 'INT'],
'_ZN5doris9Operators22bitxor_int_val_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_6IntValES6_', '', '', '', ''],
[['bitxor'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris9Operators30bitxor_big_int_val_big_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValES6_'],
+ '15FunctionContextERKNS1_9BigIntValES6_', '', '', '', ''],
[['bitxor'], 'LARGEINT', ['LARGEINT', 'LARGEINT'],
'_ZN5doris9Operators34bitxor_large_int_val_large_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11LargeIntValES6_'],
+ '15FunctionContextERKNS1_11LargeIntValES6_', '', '', '', ''],
[['bitnot'], 'TINYINT', ['TINYINT'],
'_ZN5doris9Operators19bitnot_tiny_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_10TinyIntValE'],
+ '15FunctionContextERKNS1_10TinyIntValE', '', '', '', ''],
[['bitnot'], 'SMALLINT', ['SMALLINT'],
'_ZN5doris9Operators20bitnot_small_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11SmallIntValE'],
+ '15FunctionContextERKNS1_11SmallIntValE', '', '', '', ''],
[['bitnot'], 'INT', ['INT'],
'_ZN5doris9Operators14bitnot_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_6IntValE', '', '', '', ''],
[['bitnot'], 'BIGINT', ['BIGINT'],
'_ZN5doris9Operators18bitnot_big_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValE'],
+ '15FunctionContextERKNS1_9BigIntValE', '', '', '', ''],
[['bitnot'], 'LARGEINT', ['LARGEINT'],
'_ZN5doris9Operators20bitnot_large_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11LargeIntValE'],
+ '15FunctionContextERKNS1_11LargeIntValE', '', '', '', ''],
# array functions
[['array'], 'ARRAY', ['INT', '...'],
- '_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_6IntValE'],
+ '_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_6IntValE', '', '', '', ''],
[['array'], 'ARRAY', ['VARCHAR', '...'],
- '_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
- [['array'], 'ARRAY', ['ARRAY', '...'], '', ''],
- [['array'], 'ARRAY', ['MAP', '...'], '', ''],
- [['array'], 'ARRAY', ['STRUCT', '...'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['ARRAY', 'INT'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['ARRAY', 'VARCHAR'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['MAP', 'VARCHAR'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['MAP', 'INT'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['STRUCT', 'INT'], '', ''],
- [['%element_extract%'], 'VARCHAR', ['STRUCT', 'VARCHAR'], '', ''],
+ '_ZN5doris14ArrayFunctions5arrayEPN9doris_udf15FunctionContextEiPKNS1_9StringValE', '', '', '', ''],
+ [['array'], 'ARRAY', ['ARRAY', '...'], '', '', '', '', ''],
+ [['array'], 'ARRAY', ['MAP', '...'], '', '', '', '', ''],
+ [['array'], 'ARRAY', ['STRUCT', '...'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['ARRAY', 'INT'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['ARRAY', 'VARCHAR'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['MAP', 'VARCHAR'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['MAP', 'INT'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['STRUCT', 'INT'], '', '', '', '', ''],
+ [['%element_extract%'], 'VARCHAR', ['STRUCT', 'VARCHAR'], '', '', '', '', ''],
# Timestamp functions
[['unix_timestamp'], 'INT', [],
- '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
[['unix_timestamp'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['unix_timestamp'], 'INT', ['DATE'],
- '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['unix_timestamp'], 'INT', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris18TimestampFunctions7to_unixEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['from_unixtime'], 'VARCHAR', ['INT'],
- '_ZN5doris18TimestampFunctions9from_unixEPN9doris_udf15FunctionContextERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9from_unixEPN9doris_udf15FunctionContextERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['from_unixtime'], 'VARCHAR', ['INT', 'VARCHAR'],
'_ZN5doris18TimestampFunctions9from_unixEPN9doris_udf'
'15FunctionContextERKNS1_6IntValERKNS1_9StringValE',
'_ZN5doris18TimestampFunctions14format_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris18TimestampFunctions12format_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', 'vec', ''],
[['now', 'current_timestamp', 'localtime', 'localtimestamp'], 'DATETIME', [],
- '_ZN5doris18TimestampFunctions3nowEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris18TimestampFunctions3nowEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
[['curtime', 'current_time'], 'TIME', [],
- '_ZN5doris18TimestampFunctions7curtimeEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris18TimestampFunctions7curtimeEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
[['curdate', 'current_date'], 'DATE', [],
- '_ZN5doris18TimestampFunctions7curdateEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris18TimestampFunctions7curdateEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
[['utc_timestamp'], 'DATETIME', [],
- '_ZN5doris18TimestampFunctions13utc_timestampEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris18TimestampFunctions13utc_timestampEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
[['timestamp'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9timestampEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9timestampEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['from_days'], 'DATE', ['INT'],
- '_ZN5doris18TimestampFunctions9from_daysEPN9doris_udf15FunctionContextERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9from_daysEPN9doris_udf15FunctionContextERKNS1_6IntValE',
+ '', '', '', ''],
[['to_days'], 'INT', ['DATE'],
- '_ZN5doris18TimestampFunctions7to_daysEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions7to_daysEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['year'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions4yearEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions4yearEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['month'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions5monthEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions5monthEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['quarter'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions7quarterEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions7quarterEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['dayofweek'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions11day_of_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions11day_of_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['day', 'dayofmonth'], 'INT', ['DATETIME'],
'_ZN5doris18TimestampFunctions12day_of_monthEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValE'],
+ '15FunctionContextERKNS1_11DateTimeValE', '', '', 'vec', ''],
[['dayofyear'], 'INT', ['DATETIME'],
'_ZN5doris18TimestampFunctions11day_of_yearEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValE'],
+ '15FunctionContextERKNS1_11DateTimeValE', '', '', 'vec', ''],
[['weekofyear'], 'INT', ['DATETIME'],
'_ZN5doris18TimestampFunctions12week_of_yearEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValE'],
+ '15FunctionContextERKNS1_11DateTimeValE', '', '', 'vec', ''],
[['yearweek'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9year_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9year_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['yearweek'], 'INT', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions9year_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9year_weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['week'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions4weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions4weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['week'], 'INT', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions4weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions4weekEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['hour'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions4hourEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions4hourEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['minute'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions6minuteEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions6minuteEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['second'], 'INT', ['DATETIME'],
- '_ZN5doris18TimestampFunctions6secondEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions6secondEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['makedate'], 'DATETIME', ['INT', 'INT'],
- '_ZN5doris18TimestampFunctions9make_dateEPN9doris_udf15FunctionContextERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions9make_dateEPN9doris_udf15FunctionContextERKNS1_6IntValES6_',
+ '', '', '', ''],
[['years_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9years_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['years_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9years_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['months_add', 'add_months'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions10months_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['months_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions10months_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['weeks_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9weeks_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['weeks_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9weeks_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['days_add', 'date_add', 'adddate'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions8days_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['days_sub', 'date_sub', 'subdate'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions8days_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['hours_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9hours_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['hours_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions9hours_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['minutes_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions11minutes_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['minutes_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions11minutes_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['seconds_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions11seconds_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['seconds_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions11seconds_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', 'vec', ''],
[['microseconds_add'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions10micros_addEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['microseconds_sub'], 'DATETIME', ['DATETIME', 'INT'],
'_ZN5doris18TimestampFunctions10micros_subEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['datediff'], 'INT', ['DATETIME', 'DATETIME'],
'_ZN5doris18TimestampFunctions9date_diffEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValES6_'],
+ '15FunctionContextERKNS1_11DateTimeValES6_', '', '', 'vec', ''],
[['timediff'], 'TIME', ['DATETIME', 'DATETIME'],
'_ZN5doris18TimestampFunctions9time_diffEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValES6_'],
+ '15FunctionContextERKNS1_11DateTimeValES6_', '', '', 'vec', ''],
[['str_to_date'], 'DATETIME', ['VARCHAR', 'VARCHAR'],
'_ZN5doris18TimestampFunctions11str_to_dateEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValES6_'],
+ '15FunctionContextERKNS1_9StringValES6_', '', '', 'vec', 'ALWAYS_NULLABLE'],
[['date_format'], 'VARCHAR', ['DATETIME', 'VARCHAR'],
'_ZN5doris18TimestampFunctions11date_formatEPN9doris_udf'
'15FunctionContextERKNS1_11DateTimeValERKNS1_9StringValE',
'_ZN5doris18TimestampFunctions14format_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris18TimestampFunctions12format_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', 'vec', ''],
[['date_format'], 'VARCHAR', ['DATE', 'VARCHAR'],
'_ZN5doris18TimestampFunctions11date_formatEPN9doris_udf'
'15FunctionContextERKNS1_11DateTimeValERKNS1_9StringValE',
'_ZN5doris18TimestampFunctions14format_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris18TimestampFunctions12format_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', 'vec', ''],
[['date', 'to_date'], 'DATE', ['DATETIME'],
- '_ZN5doris18TimestampFunctions7to_dateEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions7to_dateEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', 'vec', ''],
[['dayname'], 'VARCHAR', ['DATETIME'],
'_ZN5doris18TimestampFunctions8day_nameEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValE'],
+ '15FunctionContextERKNS1_11DateTimeValE', '', '', 'vec', ''],
[['monthname'], 'VARCHAR', ['DATETIME'],
'_ZN5doris18TimestampFunctions10month_nameEPN9doris_udf'
- '15FunctionContextERKNS1_11DateTimeValE'],
+ '15FunctionContextERKNS1_11DateTimeValE', '', '', 'vec', ''],
[['convert_tz'], 'DATETIME', ['DATETIME', 'VARCHAR', 'VARCHAR'],
'_ZN5doris18TimestampFunctions10convert_tzEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_9StringValES9_',
'_ZN5doris18TimestampFunctions18convert_tz_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris18TimestampFunctions16convert_tz_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris18TimestampFunctions16convert_tz_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ 'vec', 'ALWAYS_NULLABLE'],
[['years_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10years_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10years_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['months_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11months_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions11months_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['weeks_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10weeks_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10weeks_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['days_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9days_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions9days_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['hours_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10hours_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10hours_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['minutes_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12minutes_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions12minutes_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['seconds_diff'], 'BIGINT', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12seconds_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions12seconds_diffEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', 'vec', ''],
[['year_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['year_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['year_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['year_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions10year_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['year_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['year_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['year_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['year_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions9year_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['month_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['month_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['month_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['month_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions11month_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['month_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['month_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['month_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['month_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions10month_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['week_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['week_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['week_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['week_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions10week_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['week_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['week_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['week_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['week_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions9week_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['day_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['day_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['day_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['day_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions9day_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['day_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['day_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['day_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['day_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions8day_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['hour_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['hour_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['hour_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['hour_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions10hour_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['hour_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['hour_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['hour_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['hour_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions9hour_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['minute_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['minute_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['minute_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['minute_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions12minute_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['minute_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['minute_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['minute_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['minute_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions11minute_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['second_floor'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['second_floor'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['second_floor'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['second_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions12second_floorEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
[['second_ceil'], 'DATETIME', ['DATETIME'],
- '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE'],
+ '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValE',
+ '', '', '', ''],
[['second_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_'],
+ '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValES6_',
+ '', '', '', ''],
[['second_ceil'], 'DATETIME', ['DATETIME', 'INT'],
- '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE'],
+ '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValE',
+ '', '', '', ''],
[['second_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'],
- '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_'],
+ '_ZN5doris18TimestampFunctions11second_ceilEPN9doris_udf15FunctionContextERKNS1_11DateTimeValERKNS1_6IntValES6_',
+ '', '', '', ''],
# Math builtin functions
[['pi'], 'DOUBLE', [],
- '_ZN5doris13MathFunctions2piEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris13MathFunctions2piEPN9doris_udf15FunctionContextE', '', '', 'vec', 'ALWAYS_NULLABLE'],
[['e'], 'DOUBLE', [],
- '_ZN5doris13MathFunctions1eEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris13MathFunctions1eEPN9doris_udf15FunctionContextE', '', '', 'vec', 'ALWAYS_NULLABLE'],
[['abs'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['abs'], 'FLOAT', ['FLOAT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_8FloatValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_8FloatValE', '', '', 'vec', ''],
[['abs'], 'LARGEINT', ['LARGEINT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_11LargeIntValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_11LargeIntValE', '', '', 'vec', ''],
[['abs'], 'LARGEINT', ['BIGINT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_9BigIntValE', '', '', 'vec', ''],
[['abs'], 'INT', ['SMALLINT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_11SmallIntValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_11SmallIntValE', '', '', 'vec', ''],
[['abs'], 'BIGINT', ['INT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_6IntValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_6IntValE', '', '', 'vec', ''],
[['abs'], 'SMALLINT', ['TINYINT'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_10TinyIntValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_10TinyIntValE', '', '', 'vec', ''],
[['abs'], 'DECIMALV2', ['DECIMALV2'],
- '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValE'],
+ '_ZN5doris13MathFunctions3absEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValE', '', '', 'vec', ''],
[['sign'], 'FLOAT', ['DOUBLE'],
- '_ZN5doris13MathFunctions4signEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4signEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['sin'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions3sinEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions3sinEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['asin'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions4asinEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4asinEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['cos'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions3cosEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions3cosEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['acos'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions4acosEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4acosEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['tan'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions3tanEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions3tanEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['atan'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions4atanEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4atanEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['ceil', 'ceiling', 'dceil'], 'BIGINT', ['DOUBLE'],
- '_ZN5doris13MathFunctions4ceilEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4ceilEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['floor', 'dfloor'], 'BIGINT', ['DOUBLE'],
- '_ZN5doris13MathFunctions5floorEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions5floorEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['round', 'dround'], 'BIGINT', ['DOUBLE'],
- '_ZN5doris13MathFunctions5roundEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions5roundEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', '', ''],
[['round', 'dround'], 'DOUBLE', ['DOUBLE', 'INT'],
'_ZN5doris13MathFunctions11round_up_toEPN9doris_udf'
- '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', '', ''],
[['truncate'], 'DOUBLE', ['DOUBLE', 'INT'],
'_ZN5doris13MathFunctions8truncateEPN9doris_udf'
- '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9DoubleValERKNS1_6IntValE', '', '', 'vec', ''],
[['ln', 'dlog1'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions2lnEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions2lnEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['log'], 'DOUBLE', ['DOUBLE', 'DOUBLE'],
- '_ZN5doris13MathFunctions3logEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_'],
+ '_ZN5doris13MathFunctions3logEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_', '', '', 'vec', ''],
[['log2'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions4log2EPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4log2EPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['log10', 'dlog10'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions5log10EPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions5log10EPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['exp', 'dexp'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions3expEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions3expEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['radians'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions7radiansEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions7radiansEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['degrees'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions7degreesEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions7degreesEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['sqrt', 'dsqrt'], 'DOUBLE', ['DOUBLE'],
- '_ZN5doris13MathFunctions4sqrtEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions4sqrtEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['pow', 'power', 'dpow', 'fpow'], 'DOUBLE', ['DOUBLE', 'DOUBLE'],
- '_ZN5doris13MathFunctions3powEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_'],
+ '_ZN5doris13MathFunctions3powEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_', '', '', 'vec', ''],
[['rand', 'random'], 'DOUBLE', [],
'_ZN5doris13MathFunctions4randEPN9doris_udf15FunctionContextE',
'_ZN5doris13MathFunctions12rand_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris13MathFunctions10rand_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', 'ALWAYS_NOT_NULLABLE'],
[['rand', 'random'], 'DOUBLE', ['BIGINT'],
'_ZN5doris13MathFunctions9rand_seedEPN9doris_udf15FunctionContextERKNS1_9BigIntValE',
'_ZN5doris13MathFunctions12rand_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris13MathFunctions10rand_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', ''],
[['bin'], 'VARCHAR', ['BIGINT'],
- '_ZN5doris13MathFunctions3binEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
+ '_ZN5doris13MathFunctions3binEPN9doris_udf15FunctionContextERKNS1_9BigIntValE', '', '', '', ''],
[['hex'], 'VARCHAR', ['BIGINT'],
- '_ZN5doris13MathFunctions7hex_intEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
+ '_ZN5doris13MathFunctions7hex_intEPN9doris_udf15FunctionContextERKNS1_9BigIntValE', '', '', '', ''],
[['hex'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris13MathFunctions10hex_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris13MathFunctions10hex_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', '', ''],
[['unhex'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris13MathFunctions5unhexEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris13MathFunctions5unhexEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', '', ''],
[['conv'], 'VARCHAR', ['BIGINT', 'TINYINT', 'TINYINT'],
'_ZN5doris13MathFunctions8conv_intEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValERKNS1_10TinyIntValES9_'],
+ '15FunctionContextERKNS1_9BigIntValERKNS1_10TinyIntValES9_', '', '', '', ''],
[['conv'], 'VARCHAR', ['VARCHAR', 'TINYINT', 'TINYINT'],
'_ZN5doris13MathFunctions11conv_stringEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_'],
+ '15FunctionContextERKNS1_9StringValERKNS1_10TinyIntValES9_', '', '', '', ''],
[['pmod'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris13MathFunctions11pmod_bigintEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValES6_'],
+ '15FunctionContextERKNS1_9BigIntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['pmod'], 'DOUBLE', ['DOUBLE', 'DOUBLE'],
'_ZN5doris13MathFunctions11pmod_doubleEPN9doris_udf'
- '15FunctionContextERKNS1_9DoubleValES6_'],
+ '15FunctionContextERKNS1_9DoubleValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'TINYINT', ['TINYINT', 'TINYINT'],
'_ZN5doris9Operators29mod_tiny_int_val_tiny_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_10TinyIntValES6_'],
+ '15FunctionContextERKNS1_10TinyIntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'SMALLINT', ['SMALLINT', 'SMALLINT'],
'_ZN5doris9Operators31mod_small_int_val_small_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11SmallIntValES6_'],
+ '15FunctionContextERKNS1_11SmallIntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'INT', ['INT', 'INT'],
'_ZN5doris9Operators19mod_int_val_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_6IntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'BIGINT', ['BIGINT', 'BIGINT'],
'_ZN5doris9Operators27mod_big_int_val_big_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValES6_'],
+ '15FunctionContextERKNS1_9BigIntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'LARGEINT', ['LARGEINT', 'LARGEINT'],
'_ZN5doris9Operators31mod_large_int_val_large_int_valEPN9doris_udf'
- '15FunctionContextERKNS1_11LargeIntValES6_'],
+ '15FunctionContextERKNS1_11LargeIntValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'],
'_ZN5doris18DecimalV2Operators31mod_decimalv2_val_decimalv2_valEPN9doris_udf'
- '15FunctionContextERKNS1_12DecimalV2ValES6_'],
+ '15FunctionContextERKNS1_12DecimalV2ValES6_', '', '', '', 'ALWAYS_NULLABLE'],
[['mod', 'fmod'], 'FLOAT', ['FLOAT', 'FLOAT'],
- '_ZN5doris13MathFunctions10fmod_floatEPN9doris_udf15FunctionContextERKNS1_8FloatValES6_'],
+ '_ZN5doris13MathFunctions10fmod_floatEPN9doris_udf15FunctionContextERKNS1_8FloatValES6_',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['mod', 'fmod'], 'DOUBLE', ['DOUBLE', 'DOUBLE'],
- '_ZN5doris13MathFunctions11fmod_doubleEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_'],
+ '_ZN5doris13MathFunctions11fmod_doubleEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['positive'], 'BIGINT', ['BIGINT'],
'_ZN5doris13MathFunctions15positive_bigintEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValE'],
+ '15FunctionContextERKNS1_9BigIntValE', '', '', 'vec', ''],
[['positive'], 'DOUBLE', ['DOUBLE'],
'_ZN5doris13MathFunctions15positive_doubleEPN9doris_udf'
- '15FunctionContextERKNS1_9DoubleValE'],
+ '15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['positive'], 'DECIMALV2', ['DECIMALV2'],
'_ZN5doris13MathFunctions16positive_decimalEPN9doris_udf'
- '15FunctionContextERKNS1_12DecimalV2ValE'],
+ '15FunctionContextERKNS1_12DecimalV2ValE', '', '', 'vec', ''],
[['negative'], 'BIGINT', ['BIGINT'],
'_ZN5doris13MathFunctions15negative_bigintEPN9doris_udf'
- '15FunctionContextERKNS1_9BigIntValE'],
+ '15FunctionContextERKNS1_9BigIntValE', '', '', 'vec', ''],
[['negative'], 'DOUBLE', ['DOUBLE'],
'_ZN5doris13MathFunctions15negative_doubleEPN9doris_udf'
- '15FunctionContextERKNS1_9DoubleValE'],
+ '15FunctionContextERKNS1_9DoubleValE', '', '', 'vec', ''],
[['negative'], 'DECIMALV2', ['DECIMALV2'],
'_ZN5doris13MathFunctions16negative_decimalEPN9doris_udf'
- '15FunctionContextERKNS1_12DecimalV2ValE'],
+ '15FunctionContextERKNS1_12DecimalV2ValE', '', '', 'vec', ''],
[['least'], 'TINYINT', ['TINYINT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_10TinyIntValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_10TinyIntValE',
+ '', '', '', ''],
[['least'], 'SMALLINT', ['SMALLINT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11SmallIntValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11SmallIntValE',
+ '', '', '', ''],
[['least'], 'INT', ['INT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_6IntValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_6IntValE',
+ '', '', '', ''],
[['least'], 'BIGINT', ['BIGINT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9BigIntValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9BigIntValE',
+ '', '', '', ''],
[['least'], 'LARGEINT', ['LARGEINT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11LargeIntValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11LargeIntValE',
+ '', '', '', ''],
[['least'], 'FLOAT', ['FLOAT', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_8FloatValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_8FloatValE',
+ '', '', '', ''],
[['least'], 'DOUBLE', ['DOUBLE', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9DoubleValE',
+ '', '', '', ''],
[['least'], 'DATETIME', ['DATETIME', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11DateTimeValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_11DateTimeValE',
+ '', '', '', ''],
[['least'], 'DECIMALV2', ['DECIMALV2', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_12DecimalV2ValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_12DecimalV2ValE',
+ '', '', '', ''],
[['least'], 'VARCHAR', ['VARCHAR', '...'],
- '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
+ '_ZN5doris13MathFunctions5leastEPN9doris_udf15FunctionContextEiPKNS1_9StringValE',
+ '', '', '', ''],
[['greatest'], 'TINYINT', ['TINYINT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_10TinyIntValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_10TinyIntValE',
+ '', '', '', ''],
[['greatest'], 'SMALLINT', ['SMALLINT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11SmallIntValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11SmallIntValE',
+ '', '', '', ''],
[['greatest'], 'INT', ['INT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_6IntValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_6IntValE',
+ '', '', '', ''],
[['greatest'], 'BIGINT', ['BIGINT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9BigIntValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9BigIntValE',
+ '', '', '', ''],
[['greatest'], 'LARGEINT', ['LARGEINT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11LargeIntValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11LargeIntValE',
+ '', '', '', ''],
[['greatest'], 'FLOAT', ['FLOAT', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_8FloatValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_8FloatValE',
+ '', '', '', ''],
[['greatest'], 'DOUBLE', ['DOUBLE', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9DoubleValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9DoubleValE',
+ '', '', '', ''],
[['greatest'], 'DECIMALV2', ['DECIMALV2', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_12DecimalV2ValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_12DecimalV2ValE',
+ '', '', '', ''],
[['greatest'], 'DATETIME', ['DATETIME', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11DateTimeValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_11DateTimeValE',
+ '', '', '', ''],
[['greatest'], 'VARCHAR', ['VARCHAR', '...'],
- '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
+ '_ZN5doris13MathFunctions8greatestEPN9doris_udf15FunctionContextEiPKNS1_9StringValE',
+ '', '', '', ''],
# Conditional Functions
# Some of these have empty symbols because the BE special-cases them based on the
# function name
- [['if'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN', 'BOOLEAN'], ''],
- [['if'], 'TINYINT', ['BOOLEAN', 'TINYINT', 'TINYINT'], ''],
- [['if'], 'SMALLINT', ['BOOLEAN', 'SMALLINT', 'SMALLINT'], ''],
- [['if'], 'INT', ['BOOLEAN', 'INT', 'INT'], ''],
- [['if'], 'BIGINT', ['BOOLEAN', 'BIGINT', 'BIGINT'], ''],
- [['if'], 'LARGEINT', ['BOOLEAN', 'LARGEINT', 'LARGEINT'], ''],
- [['if'], 'FLOAT', ['BOOLEAN', 'FLOAT', 'FLOAT'], ''],
- [['if'], 'DOUBLE', ['BOOLEAN', 'DOUBLE', 'DOUBLE'], ''],
- [['if'], 'DATETIME', ['BOOLEAN', 'DATETIME', 'DATETIME'], ''],
- [['if'], 'DATE', ['BOOLEAN', 'DATE', 'DATE'], ''],
- [['if'], 'DECIMALV2', ['BOOLEAN', 'DECIMALV2', 'DECIMALV2'], ''],
- [['if'], 'BITMAP', ['BOOLEAN', 'BITMAP', 'BITMAP'], ''],
+ [['if'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'TINYINT', ['BOOLEAN', 'TINYINT', 'TINYINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'SMALLINT', ['BOOLEAN', 'SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'INT', ['BOOLEAN', 'INT', 'INT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'BIGINT', ['BOOLEAN', 'BIGINT', 'BIGINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'LARGEINT', ['BOOLEAN', 'LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'FLOAT', ['BOOLEAN', 'FLOAT', 'FLOAT'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'DOUBLE', ['BOOLEAN', 'DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'DATETIME', ['BOOLEAN', 'DATETIME', 'DATETIME'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'DATE', ['BOOLEAN', 'DATE', 'DATE'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'DECIMALV2', ['BOOLEAN', 'DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'CUSTOM'],
+ [['if'], 'BITMAP', ['BOOLEAN', 'BITMAP', 'BITMAP'], '', '', '', 'vec', 'CUSTOM'],
# The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
- [['if'], 'VARCHAR', ['BOOLEAN', 'VARCHAR', 'VARCHAR'], ''],
-
- [['nullif'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], ''],
- [['nullif'], 'TINYINT', ['TINYINT', 'TINYINT'], ''],
- [['nullif'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], ''],
- [['nullif'], 'INT', ['INT', 'INT'], ''],
- [['nullif'], 'BIGINT', ['BIGINT', 'BIGINT'], ''],
- [['nullif'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], ''],
- [['nullif'], 'FLOAT', ['FLOAT', 'FLOAT'], ''],
- [['nullif'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], ''],
- [['nullif'], 'DATETIME', ['DATETIME', 'DATETIME'], ''],
- [['nullif'], 'DATE', ['DATE', 'DATE'], ''],
- [['nullif'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], ''],
+ [['if'], 'VARCHAR', ['BOOLEAN', 'VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'CUSTOM'],
+
+ [['nullif'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'TINYINT', ['TINYINT', 'TINYINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'INT', ['INT', 'INT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'BIGINT', ['BIGINT', 'BIGINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'FLOAT', ['FLOAT', 'FLOAT'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'DATETIME', ['DATETIME', 'DATETIME'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'DATE', ['DATE', 'DATE'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+ [['nullif'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
# The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
- [['nullif'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], ''],
-
- [['ifnull'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], ''],
- [['ifnull'], 'TINYINT', ['TINYINT', 'TINYINT'], ''],
- [['ifnull'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], ''],
- [['ifnull'], 'INT', ['INT', 'INT'], ''],
- [['ifnull'], 'BIGINT', ['BIGINT', 'BIGINT'], ''],
- [['ifnull'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], ''],
- [['ifnull'], 'FLOAT', ['FLOAT', 'FLOAT'], ''],
- [['ifnull'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], ''],
- [['ifnull'], 'DATE', ['DATE', 'DATE'], ''],
- [['ifnull'], 'DATETIME', ['DATETIME', 'DATETIME'], ''],
- [['ifnull'], 'DATETIME', ['DATE', 'DATETIME'], ''],
- [['ifnull'], 'DATETIME', ['DATETIME', 'DATE'], ''],
- [['ifnull'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], ''],
- [['ifnull'], 'BITMAP', ['BITMAP', 'BITMAP'], ''],
+ [['nullif'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'ALWAYS_NULLABLE'],
+
+ [['ifnull'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'TINYINT', ['TINYINT', 'TINYINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'INT', ['INT', 'INT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'BIGINT', ['BIGINT', 'BIGINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'FLOAT', ['FLOAT', 'FLOAT'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DATE', ['DATE', 'DATE'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DATETIME', ['DATETIME', 'DATETIME'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DATETIME', ['DATE', 'DATETIME'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DATETIME', ['DATETIME', 'DATE'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], '', '', '', 'vec', 'CUSTOM'],
+ [['ifnull'], 'BITMAP', ['BITMAP', 'BITMAP'], '', '', '', 'vec', 'CUSTOM'],
# The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
- [['ifnull'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], ''],
-
- [['coalesce'], 'BOOLEAN', ['BOOLEAN', '...'], ''],
- [['coalesce'], 'TINYINT', ['TINYINT', '...'], ''],
- [['coalesce'], 'SMALLINT', ['SMALLINT', '...'], ''],
- [['coalesce'], 'INT', ['INT', '...'], ''],
- [['coalesce'], 'BIGINT', ['BIGINT', '...'], ''],
- [['coalesce'], 'LARGEINT', ['LARGEINT', '...'], ''],
- [['coalesce'], 'FLOAT', ['FLOAT', '...'], ''],
- [['coalesce'], 'DOUBLE', ['DOUBLE', '...'], ''],
- [['coalesce'], 'DATETIME', ['DATETIME', '...'], ''],
- [['coalesce'], 'DATE', ['DATE', '...'], ''],
- [['coalesce'], 'DECIMALV2', ['DECIMALV2', '...'], ''],
- [['coalesce'], 'BITMAP', ['BITMAP', '...'], ''],
+ [['ifnull'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], '', '', '', 'vec', 'CUSTOM'],
+
+ [['coalesce'], 'BOOLEAN', ['BOOLEAN', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'TINYINT', ['TINYINT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'SMALLINT', ['SMALLINT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'INT', ['INT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'BIGINT', ['BIGINT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'LARGEINT', ['LARGEINT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'FLOAT', ['FLOAT', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'DOUBLE', ['DOUBLE', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'DATETIME', ['DATETIME', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'DATE', ['DATE', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'DECIMALV2', ['DECIMALV2', '...'], '', '', '', '', 'CUSTOM'],
+ [['coalesce'], 'BITMAP', ['BITMAP', '...'], '', '', '', '', 'CUSTOM'],
# The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
- [['coalesce'], 'VARCHAR', ['VARCHAR', '...'], ''],
+ [['coalesce'], 'VARCHAR', ['VARCHAR', '...'], '', '', '', '', 'CUSTOM'],
[['esquery'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'],
'_ZN5doris11ESFunctions5matchEPN'
- '9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '9doris_udf15FunctionContextERKNS1_9StringValES6_', '', '', '', ''],
# String builtin functions
[['substr', 'substring'], 'VARCHAR', ['VARCHAR', 'INT'],
'_ZN5doris15StringFunctions9substringEPN'
- '9doris_udf15FunctionContextERKNS1_9StringValERKNS1_6IntValE'],
+ '9doris_udf15FunctionContextERKNS1_9StringValERKNS1_6IntValE', '', '', '', 'ALWAYS_NULLABLE'],
[['substr', 'substring'], 'VARCHAR', ['VARCHAR', 'INT', 'INT'],
'_ZN5doris15StringFunctions9substringEPN'
- '9doris_udf15FunctionContextERKNS1_9StringValERKNS1_6IntValES9_'],
+ '9doris_udf15FunctionContextERKNS1_9StringValERKNS1_6IntValES9_', '', '', 'vec', 'ALWAYS_NULLABLE'],
[['strleft', 'left'], 'VARCHAR', ['VARCHAR', 'INT'],
'_ZN5doris15StringFunctions4leftEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9StringValERKNS1_6IntValE', '', '', 'vec', ''],
[['strright', 'right'], 'VARCHAR', ['VARCHAR', 'INT'],
'_ZN5doris15StringFunctions5rightEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9StringValERKNS1_6IntValE', '', '', 'vec', ''],
[['ends_with'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions9ends_withEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15StringFunctions9ends_withEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['starts_with'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions11starts_withEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15StringFunctions11starts_withEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['null_or_empty'], 'BOOLEAN', ['VARCHAR'],
- '_ZN5doris15StringFunctions13null_or_emptyEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions13null_or_emptyEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', 'ALWAYS_NOT_NULLABLE'],
[['space'], 'VARCHAR', ['INT'],
- '_ZN5doris15StringFunctions5spaceEPN9doris_udf15FunctionContextERKNS1_6IntValE'],
+ '_ZN5doris15StringFunctions5spaceEPN9doris_udf15FunctionContextERKNS1_6IntValE', '', '', 'vec', ''],
[['repeat'], 'VARCHAR', ['VARCHAR', 'INT'],
'_ZN5doris15StringFunctions6repeatEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9StringValERKNS1_6IntValE', '', '', 'vec', ''],
[['lpad'], 'VARCHAR', ['VARCHAR', 'INT', 'VARCHAR'],
'_ZN5doris15StringFunctions4lpadEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_9StringValERKNS1_6IntValES6_', '', '', 'vec', ''],
[['rpad'], 'VARCHAR', ['VARCHAR', 'INT', 'VARCHAR'],
'_ZN5doris15StringFunctions4rpadEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValERKNS1_6IntValES6_'],
+ '15FunctionContextERKNS1_9StringValERKNS1_6IntValES6_', '', '', 'vec', ''],
[['append_trailing_char_if_absent'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions30append_trailing_char_if_absentEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15StringFunctions30append_trailing_char_if_absentEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', 'ALWAYS_NULLABLE'],
[['length'], 'INT', ['VARCHAR'],
- '_ZN5doris15StringFunctions6lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions6lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bit_length'], 'INT', ['VARCHAR'],
- '_ZN5doris15StringFunctions10bit_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions10bit_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE','', '', 'vec', ''],
+
[['char_length', 'character_length'], 'INT', ['VARCHAR'],
- '_ZN5doris15StringFunctions16char_utf8_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
- [['lower', 'lcase'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions5lowerEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions16char_utf8_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
+ [['lower', 'lcase'], 'VARCHAR', ['VARCHAR'],
+ '_ZN5doris15StringFunctions5lowerEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['upper', 'ucase'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions5upperEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions5upperEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['reverse'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions7reverseEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions7reverseEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['trim'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions4trimEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions4trimEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['ltrim'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions5ltrimEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions5ltrimEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['rtrim'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris15StringFunctions5rtrimEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions5rtrimEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['ascii'], 'INT', ['VARCHAR'],
- '_ZN5doris15StringFunctions5asciiEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions5asciiEPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', 'vec', ''],
[['instr'], 'INT', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions5instrEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15StringFunctions5instrEPN9doris_udf15FunctionContextERKNS1_9StringValES6_', '', '', 'vec', ''],
[['locate'], 'INT', ['VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions6locateEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15StringFunctions6locateEPN9doris_udf15FunctionContextERKNS1_9StringValES6_', '', '', 'vec', ''],
[['locate'], 'INT', ['VARCHAR', 'VARCHAR', 'INT'],
'_ZN5doris15StringFunctions10locate_posEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValES6_RKNS1_6IntValE'],
+ '15FunctionContextERKNS1_9StringValES6_RKNS1_6IntValE', '', '', 'vec', ''],
[['regexp_extract'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'BIGINT'],
'_ZN5doris15StringFunctions14regexp_extractEPN9doris_udf'
'15FunctionContextERKNS1_9StringValES6_RKNS1_9BigIntValE',
'_ZN5doris15StringFunctions14regexp_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris15StringFunctions12regexp_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', ''],
[['regexp_replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'],
'_ZN5doris15StringFunctions14regexp_replaceEPN9doris_udf'
'15FunctionContextERKNS1_9StringValES6_S6_',
'_ZN5doris15StringFunctions14regexp_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris15StringFunctions12regexp_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', ''],
[['concat'], 'VARCHAR', ['VARCHAR', '...'],
- '_ZN5doris15StringFunctions6concatEPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
+ '_ZN5doris15StringFunctions6concatEPN9doris_udf15FunctionContextEiPKNS1_9StringValE',
+ '', '', 'vec', ''],
[['replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'],
- '_ZN5doris15StringFunctions7replaceEPN9doris_udf15FunctionContextERKNS1_9StringValES6_S6_'],
+ '_ZN5doris15StringFunctions7replaceEPN9doris_udf15FunctionContextERKNS1_9StringValES6_S6_',
+ '', '', 'vec', ''],
[['concat_ws'], 'VARCHAR', ['VARCHAR', 'VARCHAR', '...'],
'_ZN5doris15StringFunctions9concat_wsEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValEiPS5_'],
+ '15FunctionContextERKNS1_9StringValEiPS5_', '', '', 'vec', 'CUSTOM'],
[['find_in_set'], 'INT', ['VARCHAR', 'VARCHAR'],
'_ZN5doris15StringFunctions11find_in_setEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValES6_'],
+ '15FunctionContextERKNS1_9StringValES6_', '', '', 'vec', ''],
[['parse_url'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
'_ZN5doris15StringFunctions9parse_urlEPN9doris_udf'
'15FunctionContextERKNS1_9StringValES6_',
'_ZN5doris15StringFunctions17parse_url_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris15StringFunctions15parse_url_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', ''],
[['parse_url'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'],
'_ZN5doris15StringFunctions13parse_url_keyEPN9doris_udf'
'15FunctionContextERKNS1_9StringValES6_S6_',
'_ZN5doris15StringFunctions17parse_url_prepareEPN9doris_udf'
'15FunctionContextENS2_18FunctionStateScopeE',
'_ZN5doris15StringFunctions15parse_url_closeEPN9doris_udf'
- '15FunctionContextENS2_18FunctionStateScopeE'],
+ '15FunctionContextENS2_18FunctionStateScopeE', '', ''],
[['money_format'], 'VARCHAR', ['BIGINT'],
- '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
+ '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9BigIntValE',
+ '', '', '', ''],
[['money_format'], 'VARCHAR', ['LARGEINT'],
- '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_11LargeIntValE'],
+ '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_11LargeIntValE',
+ '', '', '', ''],
[['money_format'], 'VARCHAR', ['DOUBLE'],
- '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9DoubleValE'],
+ '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9DoubleValE',
+ '', '', '', ''],
[['money_format'], 'VARCHAR', ['DECIMALV2'],
- '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValE'],
- [['split_part'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'],
- '_ZN5doris15StringFunctions10split_partEPN9doris_udf15FunctionContextERKNS1_9StringValES6_RKNS1_6IntValE'],
+ '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValE',
+ '', '', '', ''],
+ [['split_part'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'],
+ '_ZN5doris15StringFunctions10split_partEPN9doris_udf15FunctionContextERKNS1_9StringValES6_RKNS1_6IntValE',
+ '', '', '', ''],
# Utility functions
[['sleep'], 'BOOLEAN', ['INT'],
- '_ZN5doris16UtilityFunctions5sleepEPN9doris_udf15FunctionContextERKNS1_6IntValE'],
+ '_ZN5doris16UtilityFunctions5sleepEPN9doris_udf15FunctionContextERKNS1_6IntValE',
+ '', '', '', ''],
[['version'], 'VARCHAR', [],
- '_ZN5doris16UtilityFunctions7versionEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris16UtilityFunctions7versionEPN9doris_udf15FunctionContextE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
# Json functions
[['get_json_int'], 'INT', ['VARCHAR', 'VARCHAR'],
'_ZN5doris13JsonFunctions12get_json_intEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
'_ZN5doris13JsonFunctions17json_path_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ 'vec', ''],
[['get_json_double'], 'DOUBLE', ['VARCHAR', 'VARCHAR'],
'_ZN5doris13JsonFunctions15get_json_doubleEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
'_ZN5doris13JsonFunctions17json_path_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ 'vec', ''],
[['get_json_string'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
'_ZN5doris13JsonFunctions15get_json_stringEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
'_ZN5doris13JsonFunctions17json_path_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris13JsonFunctions15json_path_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ 'vec', ''],
#hll function
[['hll_cardinality'], 'BIGINT', ['VARCHAR'],
- '_ZN5doris12HllFunctions15hll_cardinalityEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris12HllFunctions15hll_cardinalityEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', 'ALWAYS_NOT_NULLABLE'],
[['hll_hash'], 'HLL', ['VARCHAR'],
- '_ZN5doris12HllFunctions8hll_hashEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris12HllFunctions8hll_hashEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', 'ALWAYS_NOT_NULLABLE'],
[['hll_empty'], 'HLL', [],
- '_ZN5doris12HllFunctions9hll_emptyEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris12HllFunctions9hll_emptyEPN9doris_udf15FunctionContextE',
+ '', '', 'vec', 'ALWAYS_NOT_NULLABLE'],
#bitmap function
[['to_bitmap'], 'BITMAP', ['VARCHAR'],
- '_ZN5doris15BitmapFunctions9to_bitmapEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions9to_bitmapEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bitmap_hash'], 'BITMAP', ['VARCHAR'],
- '_ZN5doris15BitmapFunctions11bitmap_hashEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions11bitmap_hashEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bitmap_count'], 'BIGINT', ['BITMAP'],
- '_ZN5doris15BitmapFunctions12bitmap_countEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions12bitmap_countEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bitmap_empty'], 'BITMAP', [],
- '_ZN5doris15BitmapFunctions12bitmap_emptyEPN9doris_udf15FunctionContextE'],
+ '_ZN5doris15BitmapFunctions12bitmap_emptyEPN9doris_udf15FunctionContextE',
+ '', '', 'vec', 'ALWAYS_NOT_NULLABLE'],
[['bitmap_or'], 'BITMAP', ['BITMAP','BITMAP'],
- '_ZN5doris15BitmapFunctions9bitmap_orEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15BitmapFunctions9bitmap_orEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['bitmap_xor'], 'BITMAP', ['BITMAP','BITMAP'],
- '_ZN5doris15BitmapFunctions10bitmap_xorEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15BitmapFunctions10bitmap_xorEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['bitmap_not'], 'BITMAP', ['BITMAP','BITMAP'],
- '_ZN5doris15BitmapFunctions10bitmap_notEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15BitmapFunctions10bitmap_notEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['bitmap_and'], 'BITMAP', ['BITMAP','BITMAP'],
- '_ZN5doris15BitmapFunctions10bitmap_andEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15BitmapFunctions10bitmap_andEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['bitmap_to_string'], 'VARCHAR', ['BITMAP'],
- '_ZN5doris15BitmapFunctions16bitmap_to_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions16bitmap_to_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bitmap_from_string'], 'BITMAP', ['VARCHAR'],
- '_ZN5doris15BitmapFunctions18bitmap_from_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions18bitmap_from_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
[['bitmap_contains'], 'BOOLEAN', ['BITMAP','BIGINT'],
- '_ZN5doris15BitmapFunctions15bitmap_containsEPN9doris_udf15FunctionContextERKNS1_9StringValERKNS1_9BigIntValE'],
+ '_ZN5doris15BitmapFunctions15bitmap_containsEPN9doris_udf15FunctionContextERKNS1_9StringValERKNS1_9BigIntValE',
+ '', '', 'vec', ''],
[['bitmap_has_any'], 'BOOLEAN', ['BITMAP','BITMAP'],
- '_ZN5doris15BitmapFunctions14bitmap_has_anyEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
+ '_ZN5doris15BitmapFunctions14bitmap_has_anyEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
+ '', '', 'vec', ''],
[['bitmap_min'], 'BIGINT', ['BITMAP'],
- '_ZN5doris15BitmapFunctions10bitmap_minEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris15BitmapFunctions10bitmap_minEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', 'vec', ''],
# hash functions
[['murmur_hash3_32'], 'INT', ['VARCHAR', '...'],
- '_ZN5doris13HashFunctions15murmur_hash3_32EPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
+ '_ZN5doris13HashFunctions15murmur_hash3_32EPN9doris_udf15FunctionContextEiPKNS1_9StringValE',
+ '', '', '', ''],
# aes and base64 function
[['aes_encrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
'_ZN5doris19EncryptionFunctions11aes_encryptEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValES6_'],
+ '15FunctionContextERKNS1_9StringValES6_', '', '', '', ''],
[['aes_decrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
'_ZN5doris19EncryptionFunctions11aes_decryptEPN9doris_udf'
- '15FunctionContextERKNS1_9StringValES6_'],
+ '15FunctionContextERKNS1_9StringValES6_', '', '', '', ''],
[['from_base64'], 'VARCHAR', ['VARCHAR'],
'_ZN5doris19EncryptionFunctions11from_base64EPN9doris_udf'
- '15FunctionContextERKNS1_9StringValE'],
+ '15FunctionContextERKNS1_9StringValE', '', '', '', ''],
[['to_base64'], 'VARCHAR', ['VARCHAR'],
'_ZN5doris19EncryptionFunctions9to_base64EPN9doris_udf'
- '15FunctionContextERKNS1_9StringValE'],
+ '15FunctionContextERKNS1_9StringValE', '', '', '', ''],
# for compatable with MySQL
[['md5'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris19EncryptionFunctions3md5EPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris19EncryptionFunctions3md5EPN9doris_udf15FunctionContextERKNS1_9StringValE', '', '', '', ''],
[['md5sum'], 'VARCHAR', ['VARCHAR', '...'],
- '_ZN5doris19EncryptionFunctions6md5sumEPN9doris_udf15FunctionContextEiPKNS1_9StringValE'],
+ '_ZN5doris19EncryptionFunctions6md5sumEPN9doris_udf15FunctionContextEiPKNS1_9StringValE', '', '', '', ''],
# geo functions
[['ST_Point'], 'VARCHAR', ['DOUBLE', 'DOUBLE'],
- '_ZN5doris12GeoFunctions8st_pointEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_'],
+ '_ZN5doris12GeoFunctions8st_pointEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_', '', '', '', ''],
[['ST_X'], 'DOUBLE', ['VARCHAR'],
- '_ZN5doris12GeoFunctions4st_xEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris12GeoFunctions4st_xEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['ST_Y'], 'DOUBLE', ['VARCHAR'],
- '_ZN5doris12GeoFunctions4st_yEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris12GeoFunctions4st_yEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['ST_Distance_Sphere'], 'DOUBLE', ['DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE'],
- '_ZN5doris12GeoFunctions18st_distance_sphereEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_S6_S6_'],
+ '_ZN5doris12GeoFunctions18st_distance_sphereEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_S6_S6_',
+ '', '', '', ''],
[['ST_AsText', 'ST_AsWKT'], 'VARCHAR', ['VARCHAR'],
- '_ZN5doris12GeoFunctions9st_as_wktEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
+ '_ZN5doris12GeoFunctions9st_as_wktEPN9doris_udf15FunctionContextERKNS1_9StringValE',
+ '', '', '', 'ALWAYS_NULLABLE'],
[['ST_GeometryFromText', 'ST_GeomFromText'], 'VARCHAR', ['VARCHAR'],
'_ZN5doris12GeoFunctions11st_from_wktEPN9doris_udf15FunctionContextERKNS1_9StringValE',
'_ZN5doris12GeoFunctions19st_from_wkt_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ '', 'ALWAYS_NULLABLE'],
[['ST_LineFromText', 'ST_LineStringFromText'], 'VARCHAR', ['VARCHAR'],
'_ZN5doris12GeoFunctions7st_lineEPN9doris_udf15FunctionContextERKNS1_9StringValE',
'_ZN5doris12GeoFunctions15st_line_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ '', 'ALWAYS_NULLABLE'],
[['ST_Polygon', 'ST_PolyFromText', 'ST_PolygonFromText'], 'VARCHAR', ['VARCHAR'],
'_ZN5doris12GeoFunctions10st_polygonEPN9doris_udf15FunctionContextERKNS1_9StringValE',
'_ZN5doris12GeoFunctions18st_polygon_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ '', 'ALWAYS_NULLABLE'],
[['ST_Circle'], 'VARCHAR', ['DOUBLE', 'DOUBLE', 'DOUBLE'],
'_ZN5doris12GeoFunctions9st_circleEPN9doris_udf15FunctionContextERKNS1_9DoubleValES6_S6_',
'_ZN5doris12GeoFunctions17st_circle_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris12GeoFunctions17st_from_wkt_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ '', ''],
[['ST_Contains'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'],
'_ZN5doris12GeoFunctions11st_containsEPN9doris_udf15FunctionContextERKNS1_9StringValES6_',
'_ZN5doris12GeoFunctions19st_contains_prepareEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
- '_ZN5doris12GeoFunctions17st_contains_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE'],
+ '_ZN5doris12GeoFunctions17st_contains_closeEPN9doris_udf15FunctionContextENS2_18FunctionStateScopeE',
+ '', 'ALWAYS_NULLABLE'],
# grouping sets functions
[['grouping_id'], 'BIGINT', ['BIGINT'],
- '_ZN5doris21GroupingSetsFunctions11grouping_idEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
- [['grouping'], 'BIGINT', ['BIGINT'], '_ZN5doris21GroupingSetsFunctions8groupingEPN9doris_udf15FunctionContextERKNS1_9BigIntValE'],
+ '_ZN5doris21GroupingSetsFunctions11grouping_idEPN9doris_udf15FunctionContextERKNS1_9BigIntValE',
+ '', '', '', 'ALWAYS_NOT_NULLABLE'],
+ [['grouping'], 'BIGINT', ['BIGINT'],
+ '_ZN5doris21GroupingSetsFunctions8groupingEPN9doris_udf15FunctionContextERKNS1_9BigIntValE',
+ '' ,'', '', 'ALWAYS_NOT_NULLABLE'],
]
# Except the following functions, other function will directly return
@@ -917,6 +1099,31 @@ nondeterministic_functions = [
'current_time',
'utc_timestamp'
]
+# This is the subset of ALWAYS_NULLABLE
+# The function belongs to @null_result_with_one_null_param_functions,
+# as long as one parameter is null, the function must return null.
+null_result_with_one_null_param_functions = [
+ 'unix_timestamp',
+ 'str_to_date',
+ 'convert_tz',
+ 'pi',
+ 'e',
+ 'divide',
+ 'int_divide',
+ 'pmod',
+ 'mod',
+ 'fmod',
+ 'substr',
+ 'substring',
+ 'append_trailing_char_if_absent',
+ 'ST_X',
+ 'ST_Y',
+ 'ST_AsText',
+ 'ST_GeometryFromText',
+ 'ST_LineFromText',
+ 'ST_Polygon',
+ 'ST_Contains'
+]
invisible_functions = [
]
diff --git a/gensrc/script/gen_builtins_functions.py b/gensrc/script/gen_builtins_functions.py
index 7e45eed..26ee29f 100755
--- a/gensrc/script/gen_builtins_functions.py
+++ b/gensrc/script/gen_builtins_functions.py
@@ -35,6 +35,7 @@ java_registry_preamble = '\
package org.apache.doris.builtins;\n\
\n\
import org.apache.doris.catalog.PrimitiveType;\n\
+import org.apache.doris.catalog.Function;\n\
import org.apache.doris.catalog.FunctionSet;\n\
import com.google.common.collect.Sets;\n\
import java.util.Set;\n\
@@ -59,21 +60,32 @@ meta_data_entries = []
def add_function(fn_meta_data, user_visible):
"""add function
"""
- assert 4 <= len(fn_meta_data) <= 6, \
+ assert len(fn_meta_data) == 8, \
"Invalid function entry in doris_builtins_functions.py:\n\t" + repr(fn_meta_data)
entry = {}
entry["sql_names"] = fn_meta_data[0]
entry["ret_type"] = fn_meta_data[1]
entry["args"] = fn_meta_data[2]
entry["symbol"] = fn_meta_data[3]
- if len(fn_meta_data) >= 5:
+ if fn_meta_data[4] != '':
entry["prepare"] = fn_meta_data[4]
- if len(fn_meta_data) >= 6:
+ if fn_meta_data[5] != '':
entry["close"] = fn_meta_data[5]
+ if fn_meta_data[6] != '':
+ entry['vec'] = True
+ if fn_meta_data[7] != '':
+ entry['nullable_mode'] = fn_meta_data[7]
+ else:
+ entry['nullable_mode'] = 'DEPEND_ON_ARGUMENT'
+
entry["user_visible"] = user_visible
meta_data_entries.append(entry)
+"""
+Order of params:
+name, symbol, user_visible, prepare, close, nullable_mode, ret_type, has_var_args, args
+"""
def generate_fe_entry(entry, name):
"""add function
"""
@@ -84,13 +96,17 @@ def generate_fe_entry(entry, name):
java_output += ", true"
else:
java_output += ", false"
-
if 'prepare' in entry:
java_output += ', "%s"' % entry["prepare"]
- if 'close' in entry:
- java_output += ', "%s"' % entry["close"]
- else:
- java_output += ', null'
+ else:
+ java_output += ', null'
+ if 'close' in entry:
+ java_output += ', "%s"' % entry["close"]
+ else:
+ java_output += ', null'
+
+ java_output += ", Function.NullableMode." + entry["nullable_mode"]
+ java_output += ", PrimitiveType." + entry["ret_type"]
# Check the last entry for varargs indicator.
if entry["args"] and entry["args"][-1] == "...":
@@ -98,8 +114,6 @@ def generate_fe_entry(entry, name):
java_output += ", true"
else:
java_output += ", false"
-
- java_output += ", PrimitiveType." + entry["ret_type"]
for arg in entry["args"]:
java_output += ", PrimitiveType." + arg
return java_output
@@ -114,15 +128,19 @@ def generate_fe_registry_init(filename):
for entry in meta_data_entries:
for name in entry["sql_names"]:
java_output = generate_fe_entry(entry, name)
- java_registry_file.write(" functionSet.addScalarBuiltin(%s);\n" % java_output)
+ if ("vec" not in entry):
+ java_registry_file.write(" functionSet.addScalarBuiltin(%s);\n" % java_output)
+ else:
+ java_registry_file.write(" functionSet.addScalarAndVectorizedBuiltin(%s);\n" % java_output)
+
java_registry_file.write("\n")
# add non_null_result_with_null_param_functions
java_registry_file.write(" Set<String> funcNames = Sets.newHashSet();\n")
- for entry in doris_builtins_functions.non_null_result_with_null_param_functions:
+ for entry in doris_builtins_functions.null_result_with_one_null_param_functions:
java_registry_file.write(" funcNames.add(\"%s\");\n" % entry)
- java_registry_file.write(" functionSet.buildNonNullResultWithNullParamFunction(funcNames);\n");
+ java_registry_file.write(" functionSet.buildNullResultWithOneNullParamFunction(funcNames);\n");
# add nondeterministic functions
java_registry_file.write(" Set<String> nondeterministicFuncNames = Sets.newHashSet();\n")
@@ -133,6 +151,7 @@ def generate_fe_registry_init(filename):
java_registry_file.write(java_registry_epilogue)
java_registry_file.close()
+
# Read the function metadata inputs
for function in doris_builtins_functions.visible_functions:
add_function(function, True)
diff --git a/gensrc/thrift/DataSinks.thrift b/gensrc/thrift/DataSinks.thrift
index b4ff8e1..3aa1d10 100644
--- a/gensrc/thrift/DataSinks.thrift
+++ b/gensrc/thrift/DataSinks.thrift
@@ -32,7 +32,9 @@ enum TDataSinkType {
EXPORT_SINK,
OLAP_TABLE_SINK,
MEMORY_SCRATCH_SINK,
- ODBC_TABLE_SINK
+ ODBC_TABLE_SINK,
+ VRESULT_SINK,
+ VDATA_STREAM_SINK,
}
enum TResultSinkType {
diff --git a/gensrc/thrift/Exprs.thrift b/gensrc/thrift/Exprs.thrift
index 584706a..450148f 100644
--- a/gensrc/thrift/Exprs.thrift
+++ b/gensrc/thrift/Exprs.thrift
@@ -182,6 +182,9 @@ struct TExprNode {
// If set, child[vararg_start_idx] is the first vararg child.
27: optional i32 vararg_start_idx
28: optional Types.TPrimitiveType child_type
+
+ // For vectorized engine
+ 29: optional bool is_nullable
}
// A flattened representation of a tree of Expr nodes, obtained by depth-first
diff --git a/gensrc/thrift/PaloInternalService.thrift b/gensrc/thrift/PaloInternalService.thrift
index 434c661..c89ca86 100644
--- a/gensrc/thrift/PaloInternalService.thrift
+++ b/gensrc/thrift/PaloInternalService.thrift
@@ -146,6 +146,9 @@ struct TQueryOptions {
// if the right table is greater than this value in the hash join, we will ignore IN filter
34: optional i32 runtime_filter_max_in_num = 1024;
+
+ // whether enable vectorized engine
+ 41: optional bool enable_vectorized_engine = false
}
@@ -306,7 +309,7 @@ struct TExecPlanFragmentParams {
14: optional TLoadErrorHubInfo load_error_hub_info
// The total number of fragments on same BE host
- 15: optional i32 fragment_num_on_host;
+ 15: optional i32 fragment_num_on_host
// If true, all @Common components is unset and should be got from BE's cache
// If this field is unset or it set to false, all @Common components is set.
diff --git a/gensrc/thrift/PlanNodes.thrift b/gensrc/thrift/PlanNodes.thrift
index 029f5c4..8576d57 100644
--- a/gensrc/thrift/PlanNodes.thrift
+++ b/gensrc/thrift/PlanNodes.thrift
@@ -50,7 +50,7 @@ enum TPlanNodeType {
ASSERT_NUM_ROWS_NODE,
INTERSECT_NODE,
EXCEPT_NODE,
- ODBC_SCAN_NODE
+ ODBC_SCAN_NODE,
}
// phases of an execution node
@@ -769,6 +769,8 @@ struct TPlanNode {
35: optional TOdbcScanNode odbc_scan_node
// Runtime filters assigned to this plan node, exist in HashJoinNode and ScanNode
36: optional list<TRuntimeFilterDesc> runtime_filters
+
+ 40: optional Exprs.TExpr vconjunct
}
// A flattened representation of a tree of PlanNodes, obtained by depth-first
diff --git a/gensrc/thrift/Status.thrift b/gensrc/thrift/Status.thrift
index bd3ceac..d0bbe8a 100644
--- a/gensrc/thrift/Status.thrift
+++ b/gensrc/thrift/Status.thrift
@@ -74,7 +74,17 @@ enum TStatusCode {
CONFIGURATION_ERROR = 43,
INCOMPLETE = 44,
OLAP_ERR_VERSION_ALREADY_MERGED = 45,
- DATA_QUALITY_ERROR = 46
+ DATA_QUALITY_ERROR = 46,
+
+ VEC_EXCEPTION = 50,
+ VEC_LOGIC_ERROR = 51,
+ VEC_ILLEGAL_DIVISION = 52,
+ VEC_BAD_CAST = 53,
+ VEC_CANNOT_ALLOCATE_MEMORY = 54,
+ VEC_CANNOT_MUNMAP = 55,
+ VEC_CANNOT_MREMAP = 56,
+ VEC_BAD_ARGUMENTS = 57,
+
}
struct TStatus {
diff --git a/gensrc/thrift/Types.thrift b/gensrc/thrift/Types.thrift
index a526ec3..1cd6598 100644
--- a/gensrc/thrift/Types.thrift
+++ b/gensrc/thrift/Types.thrift
@@ -325,6 +325,7 @@ struct TFunction {
11: optional i64 id
12: optional string checksum
+ 13: optional bool vectorized = false
}
enum TLoadJobState {
diff --git a/run-be-ut.sh b/run-be-ut.sh
index 4ca5c27..590b4c4 100755
--- a/run-be-ut.sh
+++ b/run-be-ut.sh
@@ -73,7 +73,7 @@ fi
eval set -- "$OPTS"
-PARALLEL=$[$(nproc)/4+1]
+PARALLEL=$[$(nproc)/2+1]
CLEAN=
RUN=
if [ $# == 1 ] ; then
diff --git a/thirdparty/build-thirdparty.sh b/thirdparty/build-thirdparty.sh
index 4afa6a9..cdd0284 100755
--- a/thirdparty/build-thirdparty.sh
+++ b/thirdparty/build-thirdparty.sh
@@ -736,6 +736,20 @@ build_parallel_hashmap() {
cp -r parallel_hashmap $TP_INSTALL_DIR/include/
}
+# pdqsort
+build_pdqsort() {
+ check_if_source_exist $PDQSORT_SOURCE
+ cd $TP_SOURCE_DIR/$PDQSORT_SOURCE
+ cp -r pdqsort.h $TP_INSTALL_DIR/include/
+}
+
+# libdivide
+build_libdivide() {
+ check_if_source_exist $LIBDIVIDE_SOURCE
+ cd $TP_SOURCE_DIR/$LIBDIVIDE_SOURCE
+ cp -r libdivide.h $TP_INSTALL_DIR/include/
+}
+
#orc
build_orc() {
check_if_source_exist $ORC_SOURCE
@@ -936,6 +950,8 @@ build_bitshuffle
build_croaringbitmap
build_fmt
build_parallel_hashmap
+build_pdqosrt
+build_libdivide
build_orc
build_cctz
build_tsan_header
diff --git a/thirdparty/vars.sh b/thirdparty/vars.sh
index 3e07ad9..6088e7e 100644
--- a/thirdparty/vars.sh
+++ b/thirdparty/vars.sh
@@ -379,6 +379,17 @@ HDFS3_NAME="libhdfs3-master.zip"
HDFS3_SOURCE="libhdfs3-master"
HDFS3_MD5SUM="9e46a16009cf86b5e187d302b3582628"
+#libdivide
+LIBDIVIDE_DOWNLOAD="https://github.com/ridiculousfish/libdivide/archive/refs/tags/v4.0.0.tar.gz"
+LIBDIVIDE_NAME="libdivide-4.0.0.tar.gz"
+LIBDIVIDE_SOURCE="libdivide-4.0.0"
+LIBDIVIDE_MD5SUM="71b99d499b9a5effd0fb2e249622b017"
+
+#pdqsort
+PDQSORT_DOWNLOAD="http://ftp.cise.ufl.edu/ubuntu/pool/universe/p/pdqsort/pdqsort_0.0.0+git20180419.orig.tar.gz"
+PDQSORT_NAME="pdqsort.tar.gz"
+PDQSORT_SOURCE="pdqsort-0.0.0+git20180419"
+PDQSORT_MD5SUM="39261c3e7b40aa7505662fac29f22d20"
# all thirdparties which need to be downloaded is set in array TP_ARCHIVES
export TP_ARCHIVES="LIBEVENT
OPENSSL
@@ -434,4 +445,7 @@ AWS_SDK
LZMA
XML2
GSASL
-HDFS3"
+HDFS3
+LIBDIVIDE
+PDQSORT"
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org