fix two resolver compatible bug in oracle mode
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -652,6 +652,8 @@ DEFINE_ERROR(OB_IGNORE_ERR_ACCESS_VIRTUAL_TABLE, -4759, -1, "HY000", "An error w
|
||||
DEFINE_ERROR(OB_LS_OFFLINE, -4760, -1, "HY000", "log stream is offline");
|
||||
DEFINE_ERROR(OB_LS_IS_DELETED, -4761, -1, "HY000", "log stream is deleted");
|
||||
DEFINE_ERROR(OB_SKIP_CHECKING_LS_STATUS, -4762, -1, "HY000", "This operation has been finished without checking ls status");
|
||||
DEFINE_ORACLE_ERROR(OB_ERR_USE_ROWID_FOR_UPDATE, -4763, -1, "HY000", "invalid user.table.column, table.column, or column specification", 1747, "invalid user.table.column, table.column, or column specification");
|
||||
DEFINE_ORACLE_ERROR_EXT(OB_ERR_UNKNOWN_SET_OPTION, -4764, -1, "HY000", "unknown SET option", "unknown SET option \'%s\'", 600, "unknown SET option", "unknown SET option \'%s\'");
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// SQL & Schema specific error code, -5000 ~ -6000
|
||||
|
@ -455,6 +455,8 @@ constexpr int OB_IGNORE_ERR_ACCESS_VIRTUAL_TABLE = -4759;
|
||||
constexpr int OB_LS_OFFLINE = -4760;
|
||||
constexpr int OB_LS_IS_DELETED = -4761;
|
||||
constexpr int OB_SKIP_CHECKING_LS_STATUS = -4762;
|
||||
constexpr int OB_ERR_USE_ROWID_FOR_UPDATE = -4763;
|
||||
constexpr int OB_ERR_UNKNOWN_SET_OPTION = -4764;
|
||||
constexpr int OB_ERR_PARSER_INIT = -5000;
|
||||
constexpr int OB_ERR_PARSE_SQL = -5001;
|
||||
constexpr int OB_ERR_RESOLVE_SQL = -5002;
|
||||
@ -2310,6 +2312,8 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
|
||||
#define OB_LS_OFFLINE__USER_ERROR_MSG "log stream is offline"
|
||||
#define OB_LS_IS_DELETED__USER_ERROR_MSG "log stream is deleted"
|
||||
#define OB_SKIP_CHECKING_LS_STATUS__USER_ERROR_MSG "This operation has been finished without checking ls status"
|
||||
#define OB_ERR_USE_ROWID_FOR_UPDATE__USER_ERROR_MSG "invalid user.table.column, table.column, or column specification"
|
||||
#define OB_ERR_UNKNOWN_SET_OPTION__USER_ERROR_MSG "unknown SET option \'%s\'"
|
||||
#define OB_ERR_PARSER_INIT__USER_ERROR_MSG "Failed to init SQL parser"
|
||||
#define OB_ERR_PARSE_SQL__USER_ERROR_MSG "%s near \'%.*s\' at line %d"
|
||||
#define OB_ERR_RESOLVE_SQL__USER_ERROR_MSG "Resolve error"
|
||||
@ -4401,6 +4405,8 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
|
||||
#define OB_LS_OFFLINE__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -4760, log stream is offline"
|
||||
#define OB_LS_IS_DELETED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -4761, log stream is deleted"
|
||||
#define OB_SKIP_CHECKING_LS_STATUS__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -4762, This operation has been finished without checking ls status"
|
||||
#define OB_ERR_USE_ROWID_FOR_UPDATE__ORA_USER_ERROR_MSG "ORA-01747: invalid user.table.column, table.column, or column specification"
|
||||
#define OB_ERR_UNKNOWN_SET_OPTION__ORA_USER_ERROR_MSG "ORA-00600: unknown SET option \'%s\'"
|
||||
#define OB_ERR_PARSER_INIT__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5000, Failed to init SQL parser"
|
||||
#define OB_ERR_PARSE_SQL__ORA_USER_ERROR_MSG "ORA-00900: %s near \'%.*s\' at line %d"
|
||||
#define OB_ERR_RESOLVE_SQL__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5002, Resolve error"
|
||||
@ -5938,7 +5944,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
|
||||
#define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)"
|
||||
#define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld"
|
||||
|
||||
extern int g_all_ob_errnos[2087];
|
||||
extern int g_all_ob_errnos[2089];
|
||||
|
||||
const char *ob_error_name(const int oberr);
|
||||
const char* ob_error_cause(const int oberr);
|
||||
|
@ -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_));
|
||||
|
@ -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))) {
|
||||
|
Reference in New Issue
Block a user