提交 000ee98d 编写于 作者: O obdev 提交者: wangzelin.wzl

fix bug for sequence

上级 51ee0c55
......@@ -95,7 +95,8 @@ int ObSequenceDMLProxy::next_batch(const uint64_t tenant_id, const uint64_t sequ
common::ObArenaAllocator allocator(ObModIds::OB_SCHEMA_SEQUENCE);
ObSqlString sql;
bool with_snap_shot = true;
ObNumber next_value; // default to zero
ObNumber next_value; // default to zero
ObNumber tmp_next_value;
ObNumber cache_inclusive_start;
ObNumber cache_exclusive_end;
ObNumber cache_size;
......@@ -177,6 +178,13 @@ int ObSequenceDMLProxy::next_batch(const uint64_t tenant_id, const uint64_t sequ
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(tmp_next_value.from(next_value, allocator))) {
// copy for check need update inner_table
LOG_WARN("fail deep copy next_val", K(next_value), K(ret));
}
}
if (OB_SUCC(ret)) {
// The following piece of logic has the following purpose:
// 1. calculate the new next_value for updating into the internal table
......@@ -249,7 +257,7 @@ int ObSequenceDMLProxy::next_batch(const uint64_t tenant_id, const uint64_t sequ
}
// update
if (OB_SUCC(ret)) {
if (OB_SUCC(ret) && tmp_next_value != next_value) {
int64_t affected_rows = 0;
if (OB_FAIL(sql.assign_fmt("UPDATE %s SET next_value = %s "
"WHERE SEQUENCE_ID = %lu",
......
......@@ -89,13 +89,18 @@ int ObAlterSequenceResolver::resolve(const ParseNode& parse_tree)
}
/* sequence options */
if (OB_SUCC(ret) && NULL != parse_tree.children_[1]) {
if (OB_UNLIKELY(T_SEQUENCE_OPTION_LIST != parse_tree.children_[1]->type_)) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("invalid option node type", K(parse_tree.children_[1]->type_), K(ret));
if (OB_SUCC(ret)) {
if (OB_NOT_NULL(parse_tree.children_[1])) {
if (OB_UNLIKELY(T_SEQUENCE_OPTION_LIST != parse_tree.children_[1]->type_)) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("invalid option node type", K(parse_tree.children_[1]->type_), K(ret));
} else {
ObSequenceResolver<ObAlterSequenceStmt> resolver;
ret = resolver.resolve_sequence_options(mystmt, parse_tree.children_[1]);
}
} else {
ObSequenceResolver<ObAlterSequenceStmt> resolver;
ret = resolver.resolve_sequence_options(mystmt, parse_tree.children_[1]);
ret = OB_ERR_REQUIRE_ALTER_SEQ_OPTION;
LOG_USER_ERROR(OB_ERR_REQUIRE_ALTER_SEQ_OPTION);
}
}
return ret;
......
......@@ -1449,7 +1449,7 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode& p
ParseNode* sub_sel_node = parse_tree.children_[CREATE_TABLE_AS_SEL_NUM_CHILD - 1];
ObSelectStmt* select_stmt = NULL;
ObSelectResolver select_resolver(params_);
select_resolver.params_.is_from_create_view_ = true;
select_resolver.params_.is_from_create_table_ = true;
// select stmt can not see upper insert stmt.
select_resolver.set_parent_namespace_resolver(NULL);
if (OB_ISNULL(session_info_)) {
......@@ -1510,6 +1510,8 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode& p
LOG_WARN("invalid null expr in select_item", K(ret), K(select_item.expr_));
} else if (select_item.is_real_alias_ || T_REF_COLUMN == select_item.expr_->get_expr_type()) {
// do nothing
} else if (select_item.expr_->get_expr_type() == T_FUN_SYS_SEQ_NEXTVAL) {
// do nothing
} else {
ret = OB_NO_COLUMN_ALIAS;
LOG_USER_ERROR(OB_NO_COLUMN_ALIAS, select_item.expr_name_.length(), select_item.expr_name_.ptr());
......
......@@ -1120,7 +1120,7 @@ int ObDMLResolver::resolve_basic_table(const ParseNode& parse_tree, TableItem*&
} else if (table_schema->is_vir_table() && !stmt->is_select_stmt()) {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "DML operation on Virtual Table/Temporary Table");
} else if (params_.is_from_create_view_ && table_schema->is_mysql_tmp_table()) {
} else if ((params_.is_from_create_view_ || params_.is_from_create_table_) && table_schema->is_mysql_tmp_table()) {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "View/Table's column refers to a temporary table");
} else if (OB_FAIL(resolve_table_partition_expr(*table_item, *table_schema))) {
......
......@@ -55,6 +55,7 @@ ObSelectResolver::ObSelectResolver(ObResolverParams& params)
transpose_item_(NULL)
{
params_.is_from_create_view_ = params.is_from_create_view_;
params_.is_from_create_table_ = params.is_from_create_table_;
}
ObSelectResolver::~ObSelectResolver()
......@@ -1357,8 +1358,8 @@ int ObSelectResolver::resolve_field_list(const ParseNode& node)
ret = OB_ERR_TOO_LONG_IDENT;
LOG_WARN("alias name too long", K(ret), K(select_item.alias_name_));
}
} else if (OB_UNLIKELY(params_.is_from_create_view_ &&
0 == select_item.expr_name_.case_compare(OB_HIDDEN_LOGICAL_ROWID_COLUMN_NAME))) {
} else if (OB_UNLIKELY((params_.is_from_create_view_ || params_.is_from_create_table_)
&& 0 == select_item.expr_name_.case_compare(OB_HIDDEN_LOGICAL_ROWID_COLUMN_NAME))) {
// must name alias for rowid
// eg: create view/table as select rowid from t1;
ret = OB_NO_COLUMN_ALIAS;
......@@ -1421,6 +1422,9 @@ int ObSelectResolver::resolve_field_list(const ParseNode& node)
} else if (T_FUN_SYS_SEQ_NEXTVAL == select_item.expr_->get_expr_type()) {
// sequence expr, expr is seq_name.nextval or seq_name.currval
// but column name displayed should be nextval or currval
if (T_OP_POS == project_node->type_) {
project_node = project_node->children_[0];
}
if (T_OBJ_ACCESS_REF != project_node->type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected select item type", K(select_item), K(project_node->type_), K(ret));
......
......@@ -17,19 +17,19 @@ namespace oceanbase {
namespace sql {
class ObViewTableResolver : public ObSelectResolver {
public:
ObViewTableResolver(ObResolverParams& params, const ObString& view_db_name, const ObString& view_name)
: ObSelectResolver(params),
parent_view_resolver_(NULL),
is_create_view_(false),
materialized_(false),
auto_name_id_(1),
view_db_name_(view_db_name),
view_name_(view_name)
{
params_.is_from_create_view_ = params.is_from_create_view_;
}
virtual ~ObViewTableResolver()
{}
ObViewTableResolver(ObResolverParams &params, const ObString &view_db_name, const ObString &view_name)
: ObSelectResolver(params),
parent_view_resolver_(NULL),
is_create_view_(false),
materialized_(false),
auto_name_id_(1),
view_db_name_(view_db_name),
view_name_(view_name)
{
params_.is_from_create_view_ = params.is_from_create_view_;
params_.is_from_create_table_ = params.is_from_create_table_;
}
virtual ~ObViewTableResolver() {}
void set_current_view_item(const TableItem& view_item)
{
......
......@@ -267,6 +267,7 @@ struct ObResolverParams {
is_from_show_resolver_(false),
is_restore_(false),
is_from_create_view_(false),
is_from_create_table_(false),
is_prepare_protocol_(false),
is_prepare_stage_(false),
is_dynamic_sql_(false),
......@@ -313,6 +314,7 @@ public:
bool is_from_show_resolver_;
bool is_restore_;
bool is_from_create_view_;
bool is_from_create_table_;
bool is_prepare_protocol_;
bool is_prepare_stage_;
bool is_dynamic_sql_;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册