From 34d61532c40b3a2f4c6cac780dca57391b77efaf Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 12 Jan 2024 10:47:46 +0000 Subject: [PATCH] [CP] fix set wrong column flag for value desc --- src/sql/resolver/dml/ob_insert_resolver.cpp | 15 +++++++++++++++ src/sql/resolver/expr/ob_raw_expr.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/sql/resolver/dml/ob_insert_resolver.cpp b/src/sql/resolver/dml/ob_insert_resolver.cpp index a38a2d78f3..4cc167bad7 100644 --- a/src/sql/resolver/dml/ob_insert_resolver.cpp +++ b/src/sql/resolver/dml/ob_insert_resolver.cpp @@ -954,6 +954,7 @@ int ObInsertResolver::mock_values_column_ref(const ObColumnRefRawExpr *column_re int ret = OB_SUCCESS; ObInsertStmt *stmt = get_insert_stmt(); ObColumnRefRawExpr *value_desc = NULL; + ObColumnRefRawExpr *base_column_ref = const_cast(column_ref); if (OB_ISNULL(column_ref) || OB_ISNULL(stmt) || OB_ISNULL(params_.expr_factory_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(column_ref), K(stmt), KP_(params_.expr_factory)); @@ -976,9 +977,23 @@ int ObInsertResolver::mock_values_column_ref(const ObColumnRefRawExpr *column_re ret = OB_ERR_UNEXPECTED; LOG_WARN(("value desc is null")); } else { + if (OB_FAIL(ObTransformUtils::get_base_column(stmt, base_column_ref))) { + // may be invalid updatable view, will be handled later. + ret = OB_SUCCESS; + base_column_ref = const_cast(column_ref); + LOG_WARN("failed to get base column", K(ret)); + } value_desc->set_result_type(column_ref->get_result_type()); value_desc->set_result_flag(column_ref->get_result_flag()); value_desc->set_column_flags(column_ref->get_column_flags()); + if (base_column_ref != column_ref) { + if (base_column_ref->is_table_part_key_column()) { + value_desc->set_table_part_key_column(); + } + if (base_column_ref->is_table_part_key_org_column()) { + value_desc->set_table_part_key_org_column(); + } + } value_desc->set_dependant_expr(const_cast(column_ref->get_dependant_expr())); value_desc->set_ref_id(stmt->get_insert_table_info().table_id_, column_ref->get_column_id()); value_desc->set_column_attr(ObString::make_string(OB_VALUES), column_ref->get_column_name()); diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index 9b0cfb8770..a215efb3ad 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -2631,6 +2631,8 @@ public: inline bool has_table_alias_name() const { return column_flags_ & TABLE_ALIAS_NAME_FLAG; } void set_column_flags(uint64_t column_flags) { column_flags_ = column_flags; } void set_table_alias_name() { column_flags_ |= TABLE_ALIAS_NAME_FLAG; } + void set_table_part_key_column() { column_flags_ |= TABLE_PART_KEY_COLUMN_FLAG; } + void set_table_part_key_org_column() { column_flags_ |= TABLE_PART_KEY_COLUMN_ORG_FLAG; } inline uint64_t get_column_flags() const { return column_flags_; } inline const ObRawExpr *get_dependant_expr() const { return dependant_expr_; } inline ObRawExpr *&get_dependant_expr() { return dependant_expr_; }