diff --git a/src/sql/code_generator/ob_dml_cg_service.cpp b/src/sql/code_generator/ob_dml_cg_service.cpp index 4889586e94..5439476402 100644 --- a/src/sql/code_generator/ob_dml_cg_service.cpp +++ b/src/sql/code_generator/ob_dml_cg_service.cpp @@ -1802,7 +1802,11 @@ int ObDmlCgService::need_fire_update_event(const ObTableSchema &table_schema, OV (column_node->str_value_ != NULL && column_node->str_len_ > 0); OX (column_name.assign_ptr(column_node->str_value_, static_cast(column_node->str_len_))); OX (column_schema = table_schema.get_column_schema(column_name)); - OV (column_schema != NULL); + if (OB_SUCC(ret) && OB_ISNULL(column_schema)) { + ret = OB_ERR_KEY_COLUMN_DOES_NOT_EXITS; + LOG_WARN("column not exist", K(ret), K(i), K(column_name)); + LOG_USER_ERROR(OB_ERR_KEY_COLUMN_DOES_NOT_EXITS, column_name.length(), column_name.ptr()); + } for (int64_t j = 0; OB_SUCC(ret) && j < base_column_ids.count(); j++) { if (column_schema->get_column_id() == base_column_ids.at(j)) { OX (need_fire = !assignments.at(j).is_implicit_); diff --git a/src/sql/resolver/ddl/ob_trigger_resolver.cpp b/src/sql/resolver/ddl/ob_trigger_resolver.cpp index 33487baad2..4bdadee9d8 100644 --- a/src/sql/resolver/ddl/ob_trigger_resolver.cpp +++ b/src/sql/resolver/ddl/ob_trigger_resolver.cpp @@ -547,10 +547,10 @@ int ObTriggerResolver::resolve_dml_event_option(const ParseNode &parse_node, LOG_USER_ERROR(OB_NOT_SUPPORTED, "nested table cluase"); } } - OZ (resolve_dml_event_list(*parse_node.children_[0], trigger_arg)); OZ (resolve_schema_name(*parse_node.children_[2], trigger_arg.base_object_database_, trigger_arg.base_object_name_)); OZ (resolve_base_object(trigger_arg, NULL == parse_node.children_[2]->children_[0])); + OZ (resolve_dml_event_list(*parse_node.children_[0], trigger_arg)); return ret; } @@ -686,6 +686,23 @@ int ObTriggerResolver::resolve_dml_event_list(const ParseNode &parse_node, LOG_WARN("parse_node type is invalid", K(ret), K(event_node->type_)); } } + if (OB_SUCC(ret)) { + const ObTableSchema *table_schema = NULL; + ObSchemaGetterGuard *schema_guard = schema_checker_->get_schema_guard(); + OZ (schema_guard->get_table_schema(trigger_arg.trigger_info_.get_tenant_id(), + trigger_arg.base_object_database_, + trigger_arg.base_object_name_, + false/*is_index*/, table_schema)); + CK (OB_NOT_NULL(table_schema)); + for (int64_t i = 0; OB_SUCC(ret) && i < col_array.count(); i++) { + const ObColumnSchemaV2 *col_schema = table_schema->get_column_schema(col_array.at(i)); + if (OB_ISNULL(col_schema)) { + ret = OB_ERR_KEY_COLUMN_DOES_NOT_EXITS; + LOG_WARN("column not exist", K(ret), K(col_array.at(i))); + LOG_USER_ERROR(OB_ERR_KEY_COLUMN_DOES_NOT_EXITS, col_array.at(i).length(), col_array.at(i).ptr()); + } + } + } return ret; } @@ -1038,6 +1055,35 @@ int ObTriggerResolver::analyze_trigger(ObSchemaGetterGuard &schema_guard, ObString source; ObPLCompiler compiler(allocator, *session_info, schema_guard, package_guard, *sql_proxy); const ObPackageInfo &package_spec_info = trigger_info.get_package_spec_info(); + if (!trigger_info.get_update_columns().empty()) { + ObPLParser parser(allocator, session_info->get_local_collation_connection()); + ObStmtNodeTree *column_list = NULL; + ParseResult parse_result; + OZ (parser.parse(trigger_info.get_update_columns(), trigger_info.get_update_columns(), parse_result, true)); + CK (OB_NOT_NULL(parse_result.result_tree_) && 1 == parse_result.result_tree_->num_child_); + CK (OB_NOT_NULL(column_list = parse_result.result_tree_->children_[0])); + CK (column_list->type_ == T_TG_COLUMN_LIST); + if (OB_SUCC(ret)) { + const ObTableSchema *table_schema = NULL; + OZ (schema_guard.get_table_schema(trigger_info.get_tenant_id(), + trigger_info.get_base_object_id(), + table_schema)); + CK (OB_NOT_NULL(table_schema)); + for (int64_t i = 0; OB_SUCC(ret) && i < column_list->num_child_; i++) { + const ParseNode *column_node = column_list->children_[i]; + const ObColumnSchemaV2 *column_schema = NULL; + OV (column_node != NULL); + OV (column_node->type_ == T_IDENT, OB_ERR_UNEXPECTED, column_node->type_); + OV (column_node->str_value_ != NULL && column_node->str_len_ > 0); + OX (column_schema = table_schema->get_column_schema(column_node->str_value_)); + if (OB_SUCC(ret) && OB_ISNULL(column_schema)) { + ret = OB_ERR_KEY_COLUMN_DOES_NOT_EXITS; + LOG_WARN("column not exist", K(ret), K(trigger_info.get_update_columns()), K(i)); + LOG_USER_ERROR(OB_ERR_KEY_COLUMN_DOES_NOT_EXITS, (int32_t)column_node->str_len_, column_node->str_value_); + } + } + } + } OZ (package_spec_ast.init(db_name, package_spec_info.get_package_name(), PL_PACKAGE_SPEC,