/** * 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_SQL_ENGINE_DML_OB_TRIGGER_HANDLER_OP_ #define OCEANBASE_SQL_ENGINE_DML_OB_TRIGGER_HANDLER_OP_ #include "sql/engine/ob_operator.h" #include "sql/engine/dml/ob_dml_ctx_define.h" namespace oceanbase { namespace sql { class ObTableModifyOp; class TriggerHandle { public: static int set_rowid_into_row(const ObTriggerColumnsInfo &cols, const ObObj &rowid_val, ObObj* cells); static int set_rowid_into_row(const ObTriggerColumnsInfo &cols, ObEvalCtx &eval_ctx, ObExpr *src_expr, ObObj* cells); static int init_param_rows(ObEvalCtx &eval_ctx, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef); static int init_param_old_row(ObEvalCtx &eval_ctx, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef); static int init_param_new_row(ObEvalCtx &eval_ctx, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef); static int do_handle_before_row(ObTableModifyOp &dml_op, ObDASDMLBaseCtDef &das_base_ctdef, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef); static int do_handle_after_row(ObTableModifyOp &dml_op, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef, uint64_t tg_event); static int do_handle_before_stmt(ObTableModifyOp &dml_op, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef, uint64_t tg_event); static int do_handle_after_stmt(ObTableModifyOp &dml_op, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef, uint64_t tg_event); static int init_trigger_params(ObDMLRtCtx &das_ctx, uint64_t trigger_event, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef); private: // trigger static int init_trigger_row(ObIAllocator &alloc, int64_t rowtype_col_count, pl::ObPLRecord *&record); static int calc_when_condition(ObTableModifyOp &dml_op, ObTrigDMLRtDef &trig_rtdef, uint64_t trigger_id, bool &need_fire); static int calc_before_row(ObTableModifyOp &dml_op, ObTrigDMLRtDef &trig_rtdef, uint64_t trigger_id); static int calc_after_row(ObTableModifyOp &dml_op, ObTrigDMLRtDef &trig_rtdef, uint64_t trigger_id); static int calc_before_stmt(ObTableModifyOp &dml_op, ObTrigDMLRtDef &trig_rtdef, uint64_t trigger_id); static int calc_after_stmt(ObTableModifyOp &dml_op, ObTrigDMLRtDef &trig_rtdef, uint64_t trigger_id); static int calc_trigger_routine(ObExecContext &exec_ctx, uint64_t trigger_id, uint64_t routine_id, ParamStore ¶ms); static int calc_trigger_routine(ObExecContext &exec_ctx, uint64_t trigger_id, uint64_t routine_id, ParamStore ¶ms, ObObj &result); static int check_and_update_new_row(ObTableModifyOp *self_op, const ObTriggerColumnsInfo &columns, ObEvalCtx &eval_ctx, const ObIArray &new_row_exprs, pl::ObPLRecord *new_record, bool check); static int do_handle_rowid_before_row(ObTableModifyOp &dml_op, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef, uint64_t tg_event); static int do_handle_rowid_after_row(ObTableModifyOp &dml_op, const ObTrigDMLCtDef &trig_ctdef, ObTrigDMLRtDef &trig_rtdef, uint64_t tg_event); static inline int destroy_compound_trigger_state(ObExecContext &exec_ctx, const ObTrigDMLCtDef &trig_ctdef); private: static const uint64_t ROUTINE_IDX_CALC_WHEN = 1; static const uint64_t ROUTINE_IDX_BEFORE_STMT = 2; static const uint64_t ROUTINE_IDX_BEFORE_ROW = 3; static const uint64_t ROUTINE_IDX_AFTER_ROW = 4; static const uint64_t ROUTINE_IDX_AFTER_STMT = 5; static const uint64_t ROUTINE_IDX_BEFORE_ROW_MYSQL = 1; static const uint64_t ROUTINE_IDX_AFTER_ROW_MYSQL = 2; static const int64_t WHEN_POINT_PARAM_OFFSET = 0; static const int64_t WHEN_POINT_PARAM_COUNT = 2; static const int64_t STMT_POINT_PARAM_OFFSET = 2; static const int64_t STMT_POINT_PARAM_COUNT = 0; static const int64_t ROW_POINT_PARAM_OFFSET = 0; static const int64_t ROW_POINT_PARAM_COUNT = 2; static const int64_t ROW_POINT_PARAM_COUNT_MYSQL = 2; }; } // namespace sql } // namespace oceanbase #endif