Files
oceanbase/src/sql/engine/ob_operator_reg.h
obdev 814de27a42 dblink_write implement [FEAT MERGE]
Co-authored-by: zzg19950727 <1071026277@qq.com>
Co-authored-by: xianyu-w <707512433@qq.com>
2023-01-29 16:23:19 +08:00

609 lines
21 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#ifndef OCEANBASE_ENGINE_OB_OPERATOR_REG_H_
#define OCEANBASE_ENGINE_OB_OPERATOR_REG_H_
#include "sql/engine/ob_phy_operator_type.h"
#include "share/ob_cluster_version.h"
#include <type_traits>
namespace oceanbase
{
namespace sql
{
namespace op_reg
{
template <int>
struct ObOpTypeTraits
{
constexpr static bool registered_ = false;
constexpr static bool has_input_ = false;
constexpr static bool vectorized_ = false;
constexpr static uint64_t ob_version_ = 0;
typedef char LogOp;
typedef char Spec;
typedef char Op;
typedef char Input;
};
template <typename T>
struct ObOpTraits
{
constexpr static int type_ = 0;
};
} // end namespace op_reg
struct VECTORIZED_OP {};
#define NOINPUT char
// check the input is char, return 0 or 1
#define CHECK_IS_CHAR__char 1, 1
#define CHECK_IS_CHAR(x) SELECT(2, CHECK_IS_CHAR__ ## x, 0)
// define operator input type traits if input is not char.
#define DEF_OP_INPUT_TRAITS(input, type) \
CONCAT(DEF_OP_INPUT_TRAITS_, CHECK_IS_CHAR(input))(input, type)
#define DEF_OP_INPUT_TRAITS_0(input, type) \
template <> struct ObOpTraits<input> { constexpr static int type_ = type; };
#define DEF_OP_INPUT_TRAITS_1(input, type)
#define REGISTER_OPERATOR_FULL(log_op, type, spec, op, x, y, z) \
REGISTER_OPERATOR_FULL_(log_op, type, spec, op, x, y, z)
#define REGISTER_OPERATOR_FULL_(...) REGISTER_OPERATOR_FULL__(__VA_ARGS__)
#define REGISTER_OPERATOR_FULL__(log_op, type, op_spec, op, input_type, \
vec_type, ob_version) \
namespace op_reg { \
template <> struct ObOpTypeTraits<type> { \
constexpr static bool registered_ = true; \
constexpr static bool has_input_ = !std::is_same<char, input_type>::value; \
constexpr static bool vectorized_ = \
std::is_same<VECTORIZED_OP, vec_type>::value; \
constexpr static uint64_t ob_version_ = \
(ob_version == 0 ? CLUSTER_VERSION_4_0_0_0 : ob_version); \
typedef log_op LogOp; \
typedef op_spec Spec; \
typedef op Op; \
typedef input_type Input; \
}; \
template <> struct ObOpTraits<op_spec> { \
constexpr static int type_ = type; \
}; \
template <> struct ObOpTraits<op> { constexpr static int type_ = type; }; \
DEF_OP_INPUT_TRAITS(input_type, type) \
}
#define REGISTER_OPERATOR_5(log_op, type, spec, op, x) \
REGISTER_OPERATOR_FULL(log_op, type, spec, op, x, char, 0)
#define REGISTER_OPERATOR_6(log_op, type, spec, op, x, y) \
REGISTER_OPERATOR_FULL(log_op, type, spec, op, x, y, 0)
#define REGISTER_OPERATOR_7(log_op, type, spec, op, x, y, z) \
REGISTER_OPERATOR_FULL(log_op, type, spec, op, x, y, z)
#define REGISTER_OPERATOR___(n, ...) REGISTER_OPERATOR_ ##n(__VA_ARGS__)
#define REGISTER_OPERATOR__(...) REGISTER_OPERATOR___(__VA_ARGS__)
#define REGISTER_OPERATOR(...) \
REGISTER_OPERATOR__(ARGS_NUM(__VA_ARGS__), __VA_ARGS__)
template <typename T>
const typename op_reg::ObOpTypeTraits<op_reg::ObOpTraits<T>::type_>::Spec &get_my_spec(const T &op)
{
typedef typename op_reg::ObOpTypeTraits<op_reg::ObOpTraits<T>::type_> Traits;
static_assert(Traits::registered_,
"only registered operator can call this function");
return static_cast<const typename Traits::Spec &>(op.get_spec());
}
#define MY_SPEC get_my_spec(*this)
// to use MY_SPEC base operator, you need to override get_my_spec() like this:
// OB_INLINE const ObBaseSpec &get_my_spec(const ObBaseOp &op)
// {
// return static_cast<ObBaseSpec &>(op.get_spec());
// }
template <typename T>
typename op_reg::ObOpTypeTraits<op_reg::ObOpTraits<T>::type_>::Input &get_my_input(const T &op)
{
typedef typename op_reg::ObOpTypeTraits<op_reg::ObOpTraits<T>::type_> Traits;
static_assert(Traits::has_input_,
"only registered operator with operator input can call this function");
// Dereferencing op.get_input() here is safe, because input pointer validity is checked in
// ObOperatorFactory::alloc_operator if operator registered with input.
return static_cast<typename Traits::Input &>(*op.get_input());
}
#define MY_INPUT get_my_input(*this)
// All operators should been registered here with REGISTER_OPERATOR macro:
// REGISTER_OPERATOR(logic_operator, type, operator_spec, operator)
// or:
// REGISTER_OPERATOR(logic_operator, type, operator_spec, operator, operator_input)
//
// Forward declarations are sufficient, do not need to include definitions.
class ObLogLimit;
class ObLimitSpec;
class ObLimitOp;
REGISTER_OPERATOR(ObLogLimit, PHY_LIMIT, ObLimitSpec, ObLimitOp, NOINPUT,
VECTORIZED_OP);
class ObLogDistinct;
class ObMergeDistinctSpec;
class ObMergeDistinctOp;
REGISTER_OPERATOR(ObLogDistinct, PHY_MERGE_DISTINCT, ObMergeDistinctSpec,
ObMergeDistinctOp, NOINPUT, VECTORIZED_OP);
class ObHashDistinctSpec;
class ObHashDistinctOp;
REGISTER_OPERATOR(ObLogDistinct, PHY_HASH_DISTINCT, ObHashDistinctSpec,
ObHashDistinctOp, NOINPUT, VECTORIZED_OP);
class ObLogMaterial;
class ObMaterialSpec;
class ObMaterialOp;
class ObMaterialOpInput;
REGISTER_OPERATOR(ObLogMaterial, PHY_MATERIAL, ObMaterialSpec, ObMaterialOp,
ObMaterialOpInput, VECTORIZED_OP);
class ObLogSort;
class ObSortSpec;
class ObSortOp;
REGISTER_OPERATOR(ObLogSort, PHY_SORT, ObSortSpec, ObSortOp, NOINPUT,
VECTORIZED_OP);
class ObLogSet;
class ObHashUnionSpec;
class ObHashUnionOp;
REGISTER_OPERATOR(ObLogSet, PHY_HASH_UNION, ObHashUnionSpec, ObHashUnionOp,
NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObHashIntersectSpec;
class ObHashIntersectOp;
REGISTER_OPERATOR(ObLogSet, PHY_HASH_INTERSECT, ObHashIntersectSpec,
ObHashIntersectOp, NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObHashExceptSpec;
class ObHashExceptOp;
REGISTER_OPERATOR(ObLogSet, PHY_HASH_EXCEPT, ObHashExceptSpec, ObHashExceptOp,
NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObMergeUnionSpec;
class ObMergeUnionOp;
REGISTER_OPERATOR(ObLogSet, PHY_MERGE_UNION, ObMergeUnionSpec, ObMergeUnionOp,
NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObRecursiveUnionAllSpec;
class ObRecursiveUnionAllOp;
REGISTER_OPERATOR(ObLogSet, PHY_RECURSIVE_UNION_ALL, ObRecursiveUnionAllSpec,
ObRecursiveUnionAllOp, NOINPUT, VECTORIZED_OP);
class ObLogTableScan;
class ObFakeCTETableSpec;
class ObFakeCTETableOp;
REGISTER_OPERATOR(ObLogTableScan, PHY_FAKE_CTE_TABLE, ObFakeCTETableSpec,
ObFakeCTETableOp, NOINPUT, VECTORIZED_OP);
class ObLogTempTableAccess;
class ObTempTableAccessOpInput;
class ObTempTableAccessOpSpec;
class ObTempTableAccessOp;
REGISTER_OPERATOR(ObLogTempTableAccess, PHY_TEMP_TABLE_ACCESS,
ObTempTableAccessOpSpec, ObTempTableAccessOp, ObTempTableAccessOpInput, VECTORIZED_OP);
class ObLogTempTableInsert;
class ObTempTableInsertOpInput;
class ObTempTableInsertOpSpec;
class ObTempTableInsertOp;
REGISTER_OPERATOR(ObLogTempTableInsert, PHY_TEMP_TABLE_INSERT,
ObTempTableInsertOpSpec, ObTempTableInsertOp, ObTempTableInsertOpInput, VECTORIZED_OP);
class ObLogTempTableTransformation;
class ObTempTableTransformationOpSpec;
class ObTempTableTransformationOp;
REGISTER_OPERATOR(ObLogTempTableTransformation, PHY_TEMP_TABLE_TRANSFORMATION,
ObTempTableTransformationOpSpec, ObTempTableTransformationOp,
NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObMergeIntersectSpec;
class ObMergeIntersectOp;
REGISTER_OPERATOR(ObLogSet, PHY_MERGE_INTERSECT, ObMergeIntersectSpec,
ObMergeIntersectOp, NOINPUT, VECTORIZED_OP);
class ObLogSet;
class ObMergeExceptSpec;
class ObMergeExceptOp;
REGISTER_OPERATOR(ObLogSet, PHY_MERGE_EXCEPT, ObMergeExceptSpec,
ObMergeExceptOp, NOINPUT, VECTORIZED_OP);
class ObLogCount;
class ObCountSpec;
class ObCountOp;
REGISTER_OPERATOR(ObLogCount, PHY_COUNT, ObCountSpec, ObCountOp, NOINPUT);
class ObLogValues;
class ObValuesSpec;
class ObValuesOp;
REGISTER_OPERATOR(ObLogValues, PHY_VALUES, ObValuesSpec, ObValuesOp, NOINPUT);
class ObLogTableScan;
class ObTableScanOpInput;
class ObTableScanSpec;
class ObTableScanOp;
REGISTER_OPERATOR(ObLogTableScan, PHY_TABLE_SCAN,
ObTableScanSpec, ObTableScanOp, ObTableScanOpInput,
VECTORIZED_OP);
class ObLogTableScan;
class ObRowSampleScanOpInput;
class ObRowSampleScanSpec;
class ObRowSampleScanOp;
REGISTER_OPERATOR(ObLogTableScan, PHY_ROW_SAMPLE_SCAN,
ObRowSampleScanSpec, ObRowSampleScanOp, ObRowSampleScanOpInput,
VECTORIZED_OP);
class ObLogTableScan;
class ObBlockSampleScanOpInput;
class ObBlockSampleScanSpec;
class ObBlockSampleScanOp;
REGISTER_OPERATOR(ObLogTableScan, PHY_BLOCK_SAMPLE_SCAN,
ObBlockSampleScanSpec, ObBlockSampleScanOp, ObBlockSampleScanOpInput,
VECTORIZED_OP);
class ObLogMerge;
class ObTableMergeSpec;
class ObTableMergeOp;
class ObTableMergeOpInput;
REGISTER_OPERATOR(ObLogMerge, PHY_MERGE, ObTableMergeSpec, ObTableMergeOp, ObTableMergeOpInput);
class ObLogInsert;
class ObTableInsertSpec;
class ObTableInsertOp;
class ObTableInsertOpInput;
REGISTER_OPERATOR(ObLogInsert, PHY_INSERT, ObTableInsertSpec,
ObTableInsertOp, ObTableInsertOpInput);
// PDML-delete
class ObLogDelete;
class ObPxMultiPartDeleteSpec;
class ObPxMultiPartDeleteOp;
class ObPxMultiPartDeleteOpInput;
REGISTER_OPERATOR(ObLogDelete, PHY_PX_MULTI_PART_DELETE, ObPxMultiPartDeleteSpec, ObPxMultiPartDeleteOp, ObPxMultiPartDeleteOpInput);
// PDML-insert
class ObLogInsert;
class ObPxMultiPartInsertSpec;
class ObPxMultiPartInsertOp;
class ObPxMultiPartInsertOpInput;
REGISTER_OPERATOR(ObLogInsert, PHY_PX_MULTI_PART_INSERT, ObPxMultiPartInsertSpec, ObPxMultiPartInsertOp, ObPxMultiPartInsertOpInput);
// PDML-update
class ObLogUpdate;
class ObPxMultiPartUpdateSpec;
class ObPxMultiPartUpdateOp;
class ObPxMultiPartUpdateOpInput;
REGISTER_OPERATOR(ObLogUpdate, PHY_PX_MULTI_PART_UPDATE, ObPxMultiPartUpdateSpec, ObPxMultiPartUpdateOp, ObPxMultiPartUpdateOpInput);
// ddl insert sstable
class ObLogInsert;
class ObPxMultiPartSSTableInsertSpec;
class ObPxMultiPartSSTableInsertOp;
class ObPxMultiPartSSTableInsertOpInput;
REGISTER_OPERATOR(ObLogInsert, PHY_PX_MULTI_PART_SSTABLE_INSERT, ObPxMultiPartSSTableInsertSpec, ObPxMultiPartSSTableInsertOp, ObPxMultiPartSSTableInsertOpInput);
class ObLogicalOperator;
class ObTableRowStoreSpec;
class ObTableRowStoreOp;
class ObTableRowStoreOpInput;
REGISTER_OPERATOR(ObLogicalOperator, PHY_TABLE_ROW_STORE, ObTableRowStoreSpec,
ObTableRowStoreOp, ObTableRowStoreOpInput);
class ObLogExprValues;
class ObExprValuesSpec;
class ObExprValuesOp;
REGISTER_OPERATOR(ObLogExprValues, PHY_EXPR_VALUES, ObExprValuesSpec, ObExprValuesOp, NOINPUT);
class ObLogDelete;
class ObTableDeleteSpec;
class ObTableDeleteOp;
class ObTableDeleteOpInput;
REGISTER_OPERATOR(ObLogDelete, PHY_DELETE, ObTableDeleteSpec,
ObTableDeleteOp, ObTableDeleteOpInput);
class ObLogInsert;
class ObTableReplaceSpec;
class ObTableReplaceOp;
class ObTableReplaceOpInput;
REGISTER_OPERATOR(ObLogInsert, PHY_REPLACE, ObTableReplaceSpec, ObTableReplaceOp,
ObTableReplaceOpInput);
class ObLogJoin;
class ObNLConnectByWithIndexSpec;
class ObNLConnectByWithIndexOp;
REGISTER_OPERATOR(ObLogJoin, PHY_NESTED_LOOP_CONNECT_BY_WITH_INDEX,
ObNLConnectByWithIndexSpec, ObNLConnectByWithIndexOp,
NOINPUT);
class ObLogJoin;
class ObNLConnectBySpec;
class ObNLConnectByOp;
REGISTER_OPERATOR(ObLogJoin, PHY_NESTED_LOOP_CONNECT_BY, ObNLConnectBySpec,
ObNLConnectByOp, NOINPUT);
class ObLogJoin;
class ObHashJoinSpec;
class ObHashJoinOp;
class ObHashJoinInput;
REGISTER_OPERATOR(ObLogJoin, PHY_HASH_JOIN, ObHashJoinSpec, ObHashJoinOp,
ObHashJoinInput, VECTORIZED_OP);
class ObNestedLoopJoinSpec;
class ObNestedLoopJoinOp;
REGISTER_OPERATOR(ObLogJoin, PHY_NESTED_LOOP_JOIN, ObNestedLoopJoinSpec,
ObNestedLoopJoinOp, NOINPUT, VECTORIZED_OP);
class ObLogSubPlanFilter;
class ObSubPlanFilterSpec;
class ObSubPlanFilterOp;
REGISTER_OPERATOR(ObLogSubPlanFilter, PHY_SUBPLAN_FILTER,
ObSubPlanFilterSpec, ObSubPlanFilterOp,
NOINPUT, VECTORIZED_OP);
class ObLogSubPlanScan;
class ObSubPlanScanSpec;
class ObSubPlanScanOp;
REGISTER_OPERATOR(ObLogSubPlanScan, PHY_SUBPLAN_SCAN, ObSubPlanScanSpec,
ObSubPlanScanOp, NOINPUT, VECTORIZED_OP);
class ObLogUnpivot;
class ObUnpivotSpec;
class ObUnpivotOp;
REGISTER_OPERATOR(ObLogUnpivot, PHY_UNPIVOT, ObUnpivotSpec,
ObUnpivotOp, NOINPUT, VECTORIZED_OP);
class ObLogForUpdate;
class ObTableLockOpInput;
class ObTableLockSpec;
class ObTableLockOp;
REGISTER_OPERATOR(ObLogForUpdate, PHY_LOCK, ObTableLockSpec, ObTableLockOp,
ObTableLockOpInput, VECTORIZED_OP);
class ObLogUpdate;
class ObTableUpdateOpInput;
class ObTableUpdateSpec;
class ObTableUpdateOp;
REGISTER_OPERATOR(ObLogUpdate, PHY_UPDATE, ObTableUpdateSpec,
ObTableUpdateOp, ObTableUpdateOpInput);
class ObLogInsert;
class ObTableInsertUpOpInput;
class ObTableInsertUpSpec;
class ObTableInsertUpOp;
REGISTER_OPERATOR(ObLogInsert, PHY_INSERT_ON_DUP, ObTableInsertUpSpec,
ObTableInsertUpOp, ObTableInsertUpOpInput);
class ObLogGroupBy;
class ObScalarAggregateSpec;
class ObScalarAggregateOp;
REGISTER_OPERATOR(ObLogGroupBy, PHY_SCALAR_AGGREGATE, ObScalarAggregateSpec,
ObScalarAggregateOp, NOINPUT, VECTORIZED_OP);
class ObLogGroupBy;
class ObMergeGroupBySpec;
class ObMergeGroupByOp;
REGISTER_OPERATOR(ObLogGroupBy, PHY_MERGE_GROUP_BY, ObMergeGroupBySpec,
ObMergeGroupByOp, NOINPUT, VECTORIZED_OP);
class ObLogGroupBy;
class ObHashGroupBySpec;
class ObHashGroupByOp;
REGISTER_OPERATOR(ObLogGroupBy, PHY_HASH_GROUP_BY, ObHashGroupBySpec,
ObHashGroupByOp, NOINPUT, VECTORIZED_OP);
class ObLogWindowFunction;
class ObWindowFunctionSpec;
class ObWindowFunctionOp;
class ObWindowFunctionOpInput;
REGISTER_OPERATOR(ObLogWindowFunction, PHY_WINDOW_FUNCTION, ObWindowFunctionSpec,
ObWindowFunctionOp, ObWindowFunctionOpInput, VECTORIZED_OP);
class ObLogJoin;
class ObMergeJoinSpec;
class ObMergeJoinOp;
REGISTER_OPERATOR(ObLogJoin, PHY_MERGE_JOIN, ObMergeJoinSpec, ObMergeJoinOp,
NOINPUT, VECTORIZED_OP);
class ObLogTopk;
class ObTopKSpec;
class ObTopKOp;
REGISTER_OPERATOR(ObLogTopk, PHY_TOPK, ObTopKSpec, ObTopKOp, NOINPUT);
class ObLogMonitoringDump;
class ObMonitoringDumpSpec;
class ObMonitoringDumpOp;
REGISTER_OPERATOR(ObLogMonitoringDump, PHY_MONITORING_DUMP, ObMonitoringDumpSpec,
ObMonitoringDumpOp, NOINPUT, VECTORIZED_OP);
class ObLogSequence;
class ObSequenceSpec;
class ObSequenceOp;
REGISTER_OPERATOR(ObLogSequence, PHY_SEQUENCE, ObSequenceSpec, ObSequenceOp,
NOINPUT);
class ObLogJoinFilter;
class ObJoinFilterSpec;
class ObJoinFilterOp;
class ObJoinFilterOpInput;
REGISTER_OPERATOR(ObLogJoinFilter, PHY_JOIN_FILTER, ObJoinFilterSpec,
ObJoinFilterOp, ObJoinFilterOpInput, VECTORIZED_OP);
// PX Operator
// PHY_GRANULE_ITERATOR,
// PHY_PX_FIFO_RECEIVE,
// PHY_PX_MERGE_SORT_RECEIVE,
// PHY_PX_DIST_TRANSMIT,
// PHY_PX_REPART_TRANSMIT,
// PHY_PX_REDUCE_TRANSMIT,
// PHY_PX_FIFO_COORD,
// PHY_PX_MERGE_SORT_COORD,
class ObLogGranuleIterator;
class ObGranuleIteratorSpec;
class ObGranuleIteratorOp;
class ObGIOpInput;
REGISTER_OPERATOR(ObLogGranuleIterator, PHY_GRANULE_ITERATOR, ObGranuleIteratorSpec,
ObGranuleIteratorOp, ObGIOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxFifoReceiveSpec;
class ObPxFifoReceiveOp;
class ObPxFifoReceiveOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_FIFO_RECEIVE, ObPxFifoReceiveSpec,
ObPxFifoReceiveOp, ObPxFifoReceiveOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxMSReceiveSpec;
class ObPxMSReceiveOp;
class ObPxMSReceiveOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_MERGE_SORT_RECEIVE, ObPxMSReceiveSpec,
ObPxMSReceiveOp, ObPxMSReceiveOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxDistTransmitSpec;
class ObPxDistTransmitOp;
class ObPxDistTransmitOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_DIST_TRANSMIT, ObPxDistTransmitSpec,
ObPxDistTransmitOp, ObPxDistTransmitOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxRepartTransmitSpec;
class ObPxRepartTransmitOp;
class ObPxRepartTransmitOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_REPART_TRANSMIT, ObPxRepartTransmitSpec,
ObPxRepartTransmitOp, ObPxRepartTransmitOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxReduceTransmitSpec;
class ObPxReduceTransmitOp;
class ObPxReduceTransmitOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_REDUCE_TRANSMIT, ObPxReduceTransmitSpec,
ObPxReduceTransmitOp, ObPxReduceTransmitOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxFifoCoordSpec;
class ObPxFifoCoordOp;
class ObPxFifoCoordOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_FIFO_COORD, ObPxFifoCoordSpec,
ObPxFifoCoordOp, ObPxFifoCoordOpInput, VECTORIZED_OP);
class ObPxOrderedCoordSpec;
class ObPxOrderedCoordOp;
class ObPxOrderedCoordOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_ORDERED_COORD, ObPxOrderedCoordSpec,
ObPxOrderedCoordOp, ObPxOrderedCoordOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObPxMSCoordSpec;
class ObPxMSCoordOp;
class ObPxMSCoordOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_PX_MERGE_SORT_COORD, ObPxMSCoordSpec,
ObPxMSCoordOp, ObPxMSCoordOpInput, VECTORIZED_OP);
class ObLogExchange;
class ObDirectReceiveSpec;
class ObDirectReceiveOp;
REGISTER_OPERATOR(ObLogExchange, PHY_DIRECT_RECEIVE, ObDirectReceiveSpec,
ObDirectReceiveOp, NOINPUT);
class ObLogExchange;
class ObDirectTransmitSpec;
class ObDirectTransmitOp;
class ObDirectTransmitOpInput;
REGISTER_OPERATOR(ObLogExchange, PHY_DIRECT_TRANSMIT, ObDirectTransmitSpec,
ObDirectTransmitOp, ObDirectTransmitOpInput);
class ObLogErrLog;
class ObErrLogSpec;
class ObErrLogOp;
REGISTER_OPERATOR(ObLogErrLog, PHY_ERR_LOG, ObErrLogSpec, ObErrLogOp, NOINPUT);
class ObLogSelectInto;
class ObSelectIntoSpec;
class ObSelectIntoOp;
REGISTER_OPERATOR(ObLogSelectInto, PHY_SELECT_INTO, ObSelectIntoSpec, ObSelectIntoOp,
NOINPUT, VECTORIZED_OP);
class ObLogLinkScan;
class ObLinkScanSpec;
class ObLinkScanOp;
REGISTER_OPERATOR(ObLogLinkScan, PHY_LINK_SCAN, ObLinkScanSpec, ObLinkScanOp,
NOINPUT, VECTORIZED_OP);
class ObLogLinkDml;
class ObLinkDmlSpec;
class ObLinkDmlOp;
REGISTER_OPERATOR(ObLogLinkDml, PHY_LINK_DML, ObLinkDmlSpec, ObLinkDmlOp, NOINPUT);
class ObLogFunctionTable;
class ObFunctionTableSpec;
class ObFunctionTableOp;
REGISTER_OPERATOR(ObLogFunctionTable, PHY_FUNCTION_TABLE, ObFunctionTableSpec,
ObFunctionTableOp, NOINPUT);
class ObLogInsertAll;
class ObTableInsertAllSpec;
class ObTableInsertAllOp;
class ObTableInsertAllOpInput;
REGISTER_OPERATOR(ObLogInsertAll, PHY_MULTI_TABLE_INSERT,
ObTableInsertAllSpec, ObTableInsertAllOp,
ObTableInsertAllOpInput);
class ObLogStatCollector;
class ObStatCollectorSpec;
class ObStatCollectorOp;
REGISTER_OPERATOR(ObLogStatCollector, PHY_STAT_COLLECTOR, ObStatCollectorSpec, ObStatCollectorOp, NOINPUT,
VECTORIZED_OP);
class ObLogJsonTable;
class ObJsonTableSpec;
class ObJsonTableOp;
REGISTER_OPERATOR(ObLogJsonTable, PHY_JSON_TABLE, ObJsonTableSpec,
ObJsonTableOp, NOINPUT);
class ObLogOptimizerStatsGathering;
class ObOptimizerStatsGatheringSpec;
class ObOptimizerStatsGatheringOp;
REGISTER_OPERATOR(ObLogOptimizerStatsGathering, PHY_OPTIMIZER_STATS_GATHERING,
ObOptimizerStatsGatheringSpec, ObOptimizerStatsGatheringOp, NOINPUT, VECTORIZED_OP);
#undef REGISTER_OPERATOR
#undef REGISTER_OPERATOR_FULL
#undef CHECK_IS_CHAR
#undef DEF_OP_INPUT_TRAITS
#undef REGISTER_OPERATOR_4
#undef REGISTER_OPERATOR_5
#undef REGISTER_OPERATOR_6
} // end namespace sql
} // end namespace oceanbase
#endif // OCEANBASE_ENGINE_OB_OPERATOR_REG_H_