[bp2] batch patch code from 31x to opensource
This commit is contained in:
		| @ -193,7 +193,7 @@ int ObOptimizer::get_session_parallel_info( | ||||
|   if (OB_ISNULL(session_info = ctx_.get_session_info())) { | ||||
|     ret = OB_ERR_UNEXPECTED; | ||||
|     LOG_WARN("get unexpected null", K(session_info), K(ret)); | ||||
|   } else if (!session_info->is_inner()) { | ||||
|   } else if (session_info->is_user_session()) { | ||||
|     if (!stmt.is_px_dml_supported_stmt()) { | ||||
|       if (OB_FAIL(session_info->get_enable_parallel_query(session_enable_parallel))) { | ||||
|         LOG_WARN("failed to get sys variable for enable parallel query", K(ret)); | ||||
| @ -235,7 +235,7 @@ int ObOptimizer::check_pdml_enabled(const ObDMLStmt& stmt, const ObSQLSessionInf | ||||
|   is_use_pdml = false; | ||||
|   const ObStmtHint& hint = stmt.get_stmt_hint(); | ||||
|   // case 1 | ||||
|   if (!session.use_static_typing_engine() || !stmt.is_pdml_supported_stmt()) { | ||||
|   if (!stmt.is_pdml_supported_stmt()) { | ||||
|     is_use_pdml = false; | ||||
|   } else if (stmt::T_INSERT == stmt.get_stmt_type() && !static_cast<const ObInsertStmt&>(stmt).value_from_select()) { | ||||
|     is_use_pdml = false; | ||||
| @ -293,6 +293,7 @@ int ObOptimizer::check_pdml_supported_feature(const ObDMLStmt& stmt, const ObSQL | ||||
|     LOG_WARN("the schema guard is null", K(ret)); | ||||
|   } else if (enable_all_pdml_feature) { | ||||
|     is_use_pdml = true; | ||||
|     LOG_INFO("event: force enable pdml. may leads error", K(ret)); | ||||
|   } else if (pdml_stmt.get_all_table_columns().count() != 1) { | ||||
|     is_use_pdml = false; | ||||
|   } else if (stmt::T_INSERT == stmt.get_stmt_type() && static_cast<const ObInsertStmt&>(stmt).get_insert_up()) { | ||||
| @ -303,20 +304,33 @@ int ObOptimizer::check_pdml_supported_feature(const ObDMLStmt& stmt, const ObSQL | ||||
|   } else if (table_schema->get_foreign_key_infos().count() > 0) { | ||||
|     LOG_TRACE("dml has foreign key, disable pdml", K(ret)); | ||||
|     is_use_pdml = false; | ||||
|   } else if (stmt::T_DELETE == stmt.get_stmt_type()) { | ||||
|     // https://code.aone.alibaba-inc.com/oceanbase/oceanbase/codereview/5345309 | ||||
|     // if no trigger, no foreign key, delete can do pdml, even if with local unique index | ||||
|     is_use_pdml = true; | ||||
|   } else if (!session.use_static_typing_engine() && stmt.get_check_constraint_exprs_size() > 0) { | ||||
|     LOG_TRACE("dml has constraint, old engine, disable pdml", K(ret)); | ||||
|     is_use_pdml = false; | ||||
|   } else { | ||||
|     // check enabling parallel with local unique index | ||||
|     //  1. disable parallel insert. because parallel unique check not supported | ||||
|     //  2. disable parallel update. only if the unqiue column is updated. | ||||
|     //     for now, we blinedly disable PDML if table has unique local index | ||||
|     uint64_t main_table_tid = pdml_stmt.get_all_table_columns().at(0).index_dml_infos_.at(0).index_tid_; | ||||
|     bool with_unique_local_idx = false; | ||||
|     if (OB_FAIL(schema_guard->check_has_local_unique_index(main_table_tid, with_unique_local_idx))) { | ||||
|       LOG_WARN("fail check if table with local unqiue index", K(main_table_tid), K(ret)); | ||||
|     } else if (with_unique_local_idx) { | ||||
|       is_use_pdml = false; | ||||
|     if (OB_SUCC(ret) && is_use_pdml) { | ||||
|       // check enabling parallel with local unique index | ||||
|       //  1. disable parallel insert. because parallel unique check not supported | ||||
|       //     (storage does not support parallel unique check in one update/insert statement.) | ||||
|       //  2. disable parallel update. only if the unqiue column is updated. | ||||
|       //     [FIXME] for now, we blindly disable PDML if table has unique local index | ||||
|       // | ||||
|       // future work: | ||||
|       // data is reshuffled by partition key, so that same unique value may be reshuffled | ||||
|       // to different thread. To make same unique value reshuffled to same thread, we can | ||||
|       // do a hybrid reshuffle: map partition key to server, map unique key to thread. | ||||
|       // However, if there are more than one unique local index, this method will still fail. | ||||
|       uint64_t main_table_tid = pdml_stmt.get_all_table_columns().at(0).index_dml_infos_.at(0).index_tid_; | ||||
|       bool with_unique_local_idx = false; | ||||
|       if (OB_FAIL(schema_guard->check_has_local_unique_index(main_table_tid, with_unique_local_idx))) { | ||||
|         LOG_WARN("fail check if table with local unqiue index", K(main_table_tid), K(ret)); | ||||
|       } else if (with_unique_local_idx) { | ||||
|         is_use_pdml = false; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   LOG_TRACE("check use all pdml feature", K(ret), K(is_use_pdml)); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 raywill
					raywill