Files
oceanbase/src/sql/engine/dml/ob_trigger_handler.h
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

124 lines
6.0 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_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 &params);
static int calc_trigger_routine(ObExecContext &exec_ctx,
uint64_t trigger_id,
uint64_t routine_id,
ParamStore &params,
ObObj &result);
static int check_and_update_new_row(ObTableModifyOp *self_op,
const ObTriggerColumnsInfo &columns,
ObEvalCtx &eval_ctx,
const ObIArray<ObExpr *> &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