diff --git a/src/share/sequence/ob_sequence_dml_proxy.cpp b/src/share/sequence/ob_sequence_dml_proxy.cpp index 240ce83f0c..4b9b6e517b 100644 --- a/src/share/sequence/ob_sequence_dml_proxy.cpp +++ b/src/share/sequence/ob_sequence_dml_proxy.cpp @@ -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", diff --git a/src/sql/resolver/ddl/ob_alter_sequence_resolver.cpp b/src/sql/resolver/ddl/ob_alter_sequence_resolver.cpp index 30a6e2904f..eaebe81aa2 100644 --- a/src/sql/resolver/ddl/ob_alter_sequence_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_sequence_resolver.cpp @@ -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 resolver; + ret = resolver.resolve_sequence_options(mystmt, parse_tree.children_[1]); + } } else { - ObSequenceResolver 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; diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index 5384b48818..da1f1f9b8b 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -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()); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index db39adc35b..55db59ce87 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -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))) { diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index f61640a6e8..b4e23e9dbb 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -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)); diff --git a/src/sql/resolver/dml/ob_view_table_resolver.h b/src/sql/resolver/dml/ob_view_table_resolver.h index 4c9f6d4b69..5a83fa9b75 100644 --- a/src/sql/resolver/dml/ob_view_table_resolver.h +++ b/src/sql/resolver/dml/ob_view_table_resolver.h @@ -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 ¶ms, 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) { diff --git a/src/sql/resolver/ob_resolver_define.h b/src/sql/resolver/ob_resolver_define.h index 3e07e9a96e..81ae035e4b 100644 --- a/src/sql/resolver/ob_resolver_define.h +++ b/src/sql/resolver/ob_resolver_define.h @@ -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_;