[FEAT MERGE]4_1_sql_feature

Co-authored-by: leslieyuchen <leslieyuchen@gmail.com>
Co-authored-by: Charles0429 <xiezhenjiang@gmail.com>
Co-authored-by: raywill <hustos@gmail.com>
This commit is contained in:
obdev
2023-01-28 16:01:26 +08:00
committed by ob-robot
parent 3080f2b66f
commit 2d19a9d8f5
846 changed files with 161957 additions and 116661 deletions

View File

@ -69,6 +69,13 @@ int ObUpdateResolver::resolve(const ParseNode &parse_tree)
}
}
// resolve with clause before resolve table items
if (OB_SUCC(ret) && is_mysql_mode()) {
if (OB_FAIL(resolve_with_clause(parse_tree.children_[WITH_MYSQL]))) {
LOG_WARN("resolve outline data hints failed", K(ret));
}
}
// 1. resolve table items
if (OB_SUCC(ret)) {
ParseNode *table_node = parse_tree.children_[TABLE];
@ -206,9 +213,20 @@ int ObUpdateResolver::try_expand_returning_exprs()
LOG_WARN("get unexpected table info count", K(ret));
} else {
ObIArray<ObAssignment> &assignments = tables_info.at(0)->assignments_;
FOREACH_CNT_X(e, update_stmt->get_returning_exprs(), OB_SUCC(ret))
{
OZ(ObTableAssignment::expand_expr(assignments, *e));
ObRawExprCopier copier(*params_.expr_factory_);
for (int64_t i = 0; OB_SUCC(ret) && i < assignments.count(); ++i) {
if (OB_FAIL(copier.add_replaced_expr(assignments.at(i).column_expr_,
assignments.at(i).expr_))) {
LOG_WARN("failed to add replaced expr", K(ret));
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(copier.add_skipped_expr(update_stmt->get_returning_aggr_items(), false))) {
LOG_WARN("failed to add uncopy exprs", K(ret));
} else if (OB_FAIL(copier.copy_on_replace(update_stmt->get_returning_exprs(),
update_stmt->get_returning_exprs()))) {
LOG_WARN("failed to copy on repalce returning exprs", K(ret));
}
}
}
}
@ -452,6 +470,21 @@ int ObUpdateResolver::resolve_table_list(const ParseNode &parse_tree)
}
}
}
if (OB_SUCC(ret) && is_mysql_mode() && 1 == update_stmt->get_from_item_size()) {
const TableItem *table_item = update_stmt->get_table_item(update_stmt->get_from_item(0));
if (OB_ISNULL(table_item)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret));
} else if (table_item->cte_type_ != TableItem::NOT_CTE) {
ret = OB_ERR_NON_UPDATABLE_TABLE;
const ObString &table_name = table_item->alias_name_.empty() ? table_item->table_name_ : table_item->alias_name_;
ObString scope_name = "UPDATE";
LOG_USER_ERROR(OB_ERR_NON_UPDATABLE_TABLE,
table_name.length(), table_name.ptr(),
scope_name.length(), scope_name.ptr());
LOG_WARN("table is not updatable", K(ret));
}
}
return ret;
}
@ -734,7 +767,8 @@ int ObUpdateResolver::resolve_update_constraints()
} else {
// TODO @yibo remove view check exprs in log_del_upd
for (uint64_t j = 0; OB_SUCC(ret) && j < table_info->view_check_exprs_.count(); ++j) {
if (OB_FAIL(ObTableAssignment::expand_expr(table_info->assignments_,
if (OB_FAIL(ObTableAssignment::expand_expr(*params_.expr_factory_,
table_info->assignments_,
table_info->view_check_exprs_.at(j)))) {
LOG_WARN("expand generated column expr failed", K(ret));
}