FIX: fix the core induced by foreign key handle overwrite the datum pointer of expr in DML op
This commit is contained in:
		| @ -264,10 +264,6 @@ public: | |||||||
|                            SavedValue &saved_conn, bool skip_cur_stmt_tables); |                            SavedValue &saved_conn, bool skip_cur_stmt_tables); | ||||||
|   int end_nested_session(sql::ObSQLSessionInfo::StmtSavedValue &saved_session, |   int end_nested_session(sql::ObSQLSessionInfo::StmtSavedValue &saved_session, | ||||||
|                          SavedValue &saved_conn); |                          SavedValue &saved_conn); | ||||||
|   int set_foreign_key_cascade(bool is_cascade); |  | ||||||
|   int get_foreign_key_cascade(bool &is_cascade) const; |  | ||||||
|   int set_foreign_key_check_exist(bool is_check_exist); |  | ||||||
|   int get_foreign_key_check_exist(bool &is_check_exist) const; |  | ||||||
|   bool is_extern_session() const { return NULL != extern_session_; } |   bool is_extern_session() const { return NULL != extern_session_; } | ||||||
|   bool is_inner_session() const { return NULL == extern_session_; } |   bool is_inner_session() const { return NULL == extern_session_; } | ||||||
|   bool is_spi_conn() const { return is_spi_conn_; } |   bool is_spi_conn() const { return is_spi_conn_; } | ||||||
|  | |||||||
| @ -2214,9 +2214,14 @@ int ObDMLService::handle_after_processing_multi_row(ObDMLModifyRowsList *dml_mod | |||||||
|   const ObDmlEventType t_insert = ObDmlEventType::DE_INSERTING; |   const ObDmlEventType t_insert = ObDmlEventType::DE_INSERTING; | ||||||
|   const ObDmlEventType t_update = ObDmlEventType::DE_UPDATING; |   const ObDmlEventType t_update = ObDmlEventType::DE_UPDATING; | ||||||
|   const ObDmlEventType t_delete = ObDmlEventType::DE_DELETING; |   const ObDmlEventType t_delete = ObDmlEventType::DE_DELETING; | ||||||
|   if (OB_ISNULL(dml_modify_rows) || OB_ISNULL(dml_op)) { |   if (OB_ISNULL(dml_modify_rows) || OB_ISNULL(dml_op) || OB_ISNULL(dml_op->get_child())) { | ||||||
|     ret = OB_ERR_UNEXPECTED; |     ret = OB_ERR_UNEXPECTED; | ||||||
|     LOG_WARN("dml operator or modify rows list is null", K(dml_modify_rows), K(dml_op)); |     LOG_WARN("dml operator or modify rows list is null", K(dml_modify_rows), K(dml_op)); | ||||||
|  |   } else if (OB_ISNULL(dml_op->last_store_row_.get_store_row()) && | ||||||
|  |     OB_FAIL(dml_op->last_store_row_.init(dml_op->get_exec_ctx().get_allocator(), dml_op->get_child()->get_spec().output_.count()))) { | ||||||
|  |     LOG_WARN("failed to init shadow stored row", K(ret)); | ||||||
|  |   } else if (OB_FAIL(dml_op->last_store_row_.shadow_copy(dml_op->get_child()->get_spec().output_, dml_op->get_eval_ctx()))) { | ||||||
|  |     LOG_WARN("failed to backup the datum ptr of child operator", K(ret)); | ||||||
|   } else { |   } else { | ||||||
|     ObDMLModifyRowsList::iterator row_iter = dml_modify_rows->begin(); |     ObDMLModifyRowsList::iterator row_iter = dml_modify_rows->begin(); | ||||||
|     for (; OB_SUCC(ret) && row_iter != dml_modify_rows->end(); row_iter++) { |     for (; OB_SUCC(ret) && row_iter != dml_modify_rows->end(); row_iter++) { | ||||||
| @ -2276,8 +2281,12 @@ int ObDMLService::handle_after_processing_multi_row(ObDMLModifyRowsList *dml_mod | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // check the result of batch foreign key check results |     // check the result of batch foreign key check results | ||||||
|     if (OB_SUCC(ret) && dml_op->get_spec().check_fk_batch_ && OB_FAIL(dml_op->perform_batch_fk_check())) { |     if (OB_SUCC(ret)) { | ||||||
|       LOG_WARN("failed to perform batch foreign key check", K(ret)); |       if (dml_op->get_spec().check_fk_batch_ && OB_FAIL(dml_op->perform_batch_fk_check())) { | ||||||
|  |         LOG_WARN("failed to perform batch foreign key check", K(ret)); | ||||||
|  |       } else if (OB_FAIL(dml_op->last_store_row_.restore(dml_op->get_child()->get_spec().output_, dml_op->get_eval_ctx()))) { | ||||||
|  |         LOG_WARN("failed to restore the datum ptr", K(ret)); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
|  | |||||||
| @ -675,6 +675,7 @@ ObTableModifyOp::ObTableModifyOp(ObExecContext &ctx, | |||||||
|     execute_single_row_(false), |     execute_single_row_(false), | ||||||
|     err_log_rt_def_(), |     err_log_rt_def_(), | ||||||
|     dml_modify_rows_(ctx.get_allocator()), |     dml_modify_rows_(ctx.get_allocator()), | ||||||
|  |     last_store_row_(), | ||||||
|     saved_session_(NULL) |     saved_session_(NULL) | ||||||
| { | { | ||||||
|   obj_print_params_ = CREATE_OBJ_PRINT_PARAM(ctx_.get_my_session()); |   obj_print_params_ = CREATE_OBJ_PRINT_PARAM(ctx_.get_my_session()); | ||||||
|  | |||||||
| @ -206,6 +206,7 @@ public: | |||||||
|     dml_rtctx_.cleanup(); |     dml_rtctx_.cleanup(); | ||||||
|     trigger_clear_exprs_.reset(); |     trigger_clear_exprs_.reset(); | ||||||
|     fk_checkers_.reset(); |     fk_checkers_.reset(); | ||||||
|  |     last_store_row_.reset(); | ||||||
|     ObOperator::destroy(); |     ObOperator::destroy(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -214,10 +215,6 @@ public: | |||||||
|   int close_inner_conn(); |   int close_inner_conn(); | ||||||
|   int begin_nested_session(bool skip_cur_stmt_tables); |   int begin_nested_session(bool skip_cur_stmt_tables); | ||||||
|   int end_nested_session(); |   int end_nested_session(); | ||||||
|   int set_foreign_key_cascade(bool is_cascade); |  | ||||||
|   int get_foreign_key_cascade(bool &is_cascade) const; |  | ||||||
|   int set_foreign_key_check_exist(bool is_check_exist); |  | ||||||
|   int get_foreign_key_check_exist(bool &is_check_exist) const; |  | ||||||
|   int execute_write(const char *sql); |   int execute_write(const char *sql); | ||||||
|   int execute_read(const char *sql, common::ObMySQLProxy::MySQLResult &res); |   int execute_read(const char *sql, common::ObMySQLProxy::MySQLResult &res); | ||||||
|   int check_stack(); |   int check_stack(); | ||||||
| @ -292,6 +289,7 @@ public: | |||||||
|   ObSEArray<ObExpr *, 4> trigger_clear_exprs_; |   ObSEArray<ObExpr *, 4> trigger_clear_exprs_; | ||||||
|   ObDMLModifyRowsList dml_modify_rows_; |   ObDMLModifyRowsList dml_modify_rows_; | ||||||
|   ObSEArray<ObForeignKeyChecker *, 4> fk_checkers_; |   ObSEArray<ObForeignKeyChecker *, 4> fk_checkers_; | ||||||
|  |   ObChunkDatumStore::ShadowStoredRow last_store_row_; | ||||||
| private: | private: | ||||||
|   ObSQLSessionInfo::StmtSavedValue *saved_session_; |   ObSQLSessionInfo::StmtSavedValue *saved_session_; | ||||||
|   char saved_session_buf_[sizeof(ObSQLSessionInfo::StmtSavedValue)] __attribute__((aligned (16)));; |   char saved_session_buf_[sizeof(ObSQLSessionInfo::StmtSavedValue)] __attribute__((aligned (16)));; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev