fix two resolver compatible bug in oracle mode

This commit is contained in:
Larry955
2023-06-25 10:42:24 +00:00
committed by ob-robot
parent 7849c225ba
commit e0464846c4
5 changed files with 49 additions and 12 deletions

View File

@ -89,10 +89,13 @@ int ObVariableSetResolver::resolve(const ParseNode &parse_tree)
var_name.assign_ptr(var->str_value_, static_cast<int32_t>(var->str_len_));
} else if (T_OBJ_ACCESS_REF == var->type_) { //Oracle mode
const ParseNode *name_node = NULL;
if (OB_ISNULL(name_node = var->children_[0]) || OB_UNLIKELY(var->children_[1] != NULL) ||
OB_UNLIKELY(name_node->type_ != T_IDENT)) {
if (OB_ISNULL(name_node = var->children_[0])) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("Variable name is not an identifier type", K(ret));
LOG_WARN("get unexpected null", K(ret));
} else if (OB_UNLIKELY(name_node->type_ != T_IDENT) || OB_UNLIKELY(var->children_[1] != NULL)) {
ret = OB_ERR_UNKNOWN_SET_OPTION;
LOG_WARN("unknown SET option", K(ret), K(name_node->type_), K(var->children_[1]));
LOG_USER_ERROR(OB_ERR_UNKNOWN_SET_OPTION, name_node->str_value_);
} else {
var_node.is_system_variable_ = true; //PL的set语句在PL resolver里解析,不会走到这里,所以到这里的肯定是系统变量的缺省写法
var_name.assign_ptr(name_node->str_value_, static_cast<int32_t>(name_node->str_len_));

View File

@ -1427,7 +1427,13 @@ int ObSelectResolver::resolve_for_update_clause_oracle(const ParseNode &node)
LOG_WARN("of node is null", K(ret));
} else if (OB_FAIL(resolve_sql_expr(*column_node, expr))) {
LOG_WARN("failed to resolve sql expr", K(ret));
} else if (OB_ISNULL(expr) || OB_UNLIKELY(!expr->is_column_ref_expr())) {
} else if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("expr is invalid", K(ret), K(expr));
} else if (is_oracle_mode() && expr->get_data_type() == ObURowIDType) {
ret = OB_ERR_USE_ROWID_FOR_UPDATE;
LOG_WARN("FOR UPDATE OF ROWID is illegal", K(ret), K(*expr));
} else if (OB_UNLIKELY(!expr->is_column_ref_expr())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("expr is invalid", K(ret), K(expr));
} else {
@ -1523,13 +1529,7 @@ int ObSelectResolver::set_for_update_oracle(ObSelectStmt &stmt,
if (stmt.is_set_stmt()) {
ret = OB_ERR_FOR_UPDATE_SELECT_VIEW_CANNOT;
LOG_WARN("invalid for update", K(ret));
} else if (col != NULL && col->get_data_type() == ObURowIDType &&
ObCharset::case_insensitive_equal(to_cstring(col->get_column_name()), OB_HIDDEN_LOGICAL_ROWID_COLUMN_NAME)) {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "invalid user.table.column, table.column, or column specification");
LOG_WARN("pseudo_column rowid is not supported for update", K(col->get_column_name()), K(col->get_data_type()));
}
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_table_size(); ++i) {
TableItem *table = NULL;
if (OB_ISNULL(table = stmt.get_table_item(i))) {