fix some bugs
This commit is contained in:
		| @ -24,6 +24,7 @@ | ||||
| #include "sql/ob_optimizer_trace_impl.h" | ||||
| #include "sql/engine/cmd/ob_table_direct_insert_service.h" | ||||
| #include "sql/dblink/ob_dblink_utils.h" | ||||
| #include "sql/resolver/dml/ob_merge_stmt.h" | ||||
| using namespace oceanbase; | ||||
| using namespace sql; | ||||
| using namespace oceanbase::common; | ||||
| @ -445,14 +446,22 @@ int ObOptimizer::check_pdml_supported_feature(const ObDelUpdStmt &pdml_stmt, | ||||
|         } | ||||
|       } | ||||
|     } else if (stmt::T_MERGE == pdml_stmt.get_stmt_type()) { | ||||
|       bool with_unique_global_idx = false; | ||||
|       if (OB_FAIL(schema_guard->check_has_global_unique_index( | ||||
|                   session.get_effective_tenant_id(), | ||||
|                   main_table_tid, with_unique_global_idx))) { | ||||
|         LOG_WARN("fail check if table with global unqiue index", K(main_table_tid), K(ret)); | ||||
|       } else if (with_unique_global_idx) { | ||||
|       bool update_rowkey = false; | ||||
|       ObSEArray<uint64_t, 4> index_ids; | ||||
|      if (OB_FAIL(schema_guard->get_all_unique_index(session.get_effective_tenant_id(), | ||||
|                                                     main_table_tid, | ||||
|                                                     index_ids))) { | ||||
|         LOG_WARN("failed to get all local unique index", K(ret)); | ||||
|       } else if (OB_FAIL(index_ids.push_back(main_table_tid))) { | ||||
|         LOG_WARN("failed to push back index ids", K(ret)); | ||||
|       } else if (OB_FAIL(check_merge_stmt_is_update_index_rowkey(session, | ||||
|                                                                  pdml_stmt, | ||||
|                                                                  index_ids, | ||||
|                                                                  update_rowkey))) { | ||||
|         LOG_WARN("failed to check merge stmt update rowkey", K(ret)); | ||||
|       } else if (update_rowkey) { | ||||
|         is_use_pdml = false; | ||||
|         ctx_.add_plan_note(PDML_DISABLED_BY_GLOBAL_UK); | ||||
|         ctx_.add_plan_note(PDML_DISABLE_BY_MERGE_UPDATE_PK); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @ -974,5 +983,60 @@ int ObOptimizer::check_force_default_stat() | ||||
|   } else if (is_exists_opt && use_default_opt_stat) { | ||||
|     ctx_.set_use_default_stat(); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| int ObOptimizer::check_merge_stmt_is_update_index_rowkey(const ObSQLSessionInfo &session, | ||||
|                                                          const ObDMLStmt &stmt, | ||||
|                                                          const ObIArray<uint64_t> &index_ids, | ||||
|                                                          bool &is_update) | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|   share::schema::ObSchemaGetterGuard *schema_guard = ctx_.get_schema_guard(); | ||||
|   const ObTableSchema *table_schema = NULL; | ||||
|   const ObMergeStmt &merge_stmt = static_cast<const ObMergeStmt&>(stmt); | ||||
|   const ObMergeTableInfo& merge_table_info = merge_stmt.get_merge_table_info(); | ||||
|   ObSEArray<uint64_t, 4> rowkey_ids; | ||||
|   ObSEArray<uint64_t, 4> tmp_rowkey_ids; | ||||
|   const ObColumnRefRawExpr* column_expr = nullptr; | ||||
|   const ColumnItem* column_item = nullptr; | ||||
|   is_update = false; | ||||
|   if (OB_ISNULL(schema_guard) || | ||||
|       OB_UNLIKELY(stmt::T_MERGE != stmt.get_stmt_type())) { | ||||
|     ret = OB_ERR_UNEXPECTED; | ||||
|     LOG_WARN("the schema guard is null", K(ret)); | ||||
|   } | ||||
|   for (int64_t i = 0; OB_SUCC(ret) && i < index_ids.count(); ++i) { | ||||
|     tmp_rowkey_ids.reuse(); | ||||
|     if (OB_FAIL(schema_guard->get_table_schema(session.get_effective_tenant_id(), | ||||
|                                                index_ids.at(i), | ||||
|                                                table_schema))) { | ||||
|       LOG_WARN("failed to get table schema", K(ret)); | ||||
|     } else if (OB_ISNULL(table_schema)) { | ||||
|       ret = OB_ERR_UNEXPECTED; | ||||
|       LOG_WARN("get unexpect null", K(ret), K(table_schema)); | ||||
|     } else if (OB_FAIL(table_schema->get_rowkey_info().get_column_ids(tmp_rowkey_ids))) { | ||||
|       LOG_WARN("failed to get column ids", K(ret)); | ||||
|     } else if (OB_FAIL(append_array_no_dup(rowkey_ids, tmp_rowkey_ids))) { | ||||
|       LOG_WARN("failed to append array no dup", K(ret)); | ||||
|     } | ||||
|   } | ||||
|   for (int64_t i = 0; OB_SUCC(ret) && !is_update && i < merge_table_info.assignments_.count(); ++i) { | ||||
|     if (OB_ISNULL(column_expr = merge_table_info.assignments_.at(i).column_expr_)) { | ||||
|       ret = OB_ERR_UNEXPECTED; | ||||
|       LOG_WARN("get null column expr", K(ret)); | ||||
|     } else if (merge_table_info.table_id_ != merge_table_info.loc_table_id_) { | ||||
|       if (OB_ISNULL(column_item = stmt.get_column_item_by_id(column_expr->get_table_id(), | ||||
|                                                               column_expr->get_column_id()))) { | ||||
|         ret = OB_ERR_UNEXPECTED; | ||||
|         LOG_WARN("get null column item", K(ret)); | ||||
|       } else { | ||||
|         is_update = ObOptimizerUtil::find_item(rowkey_ids, column_item->base_cid_); | ||||
|       } | ||||
|     } else { | ||||
|       is_update = ObOptimizerUtil::find_item(rowkey_ids, column_expr->get_column_id()); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 ChangerR
					ChangerR