From 1b2993357fc3b024f5c9963f1d0483ce21a8e167 Mon Sep 17 00:00:00 2001 From: hwx65 <1780011298@qq.com> Date: Tue, 2 Apr 2024 09:46:04 +0000 Subject: [PATCH] Fixed the issue where columns could not be inserted after rebuilding the default sequence --- .../resolver/dml/ob_default_value_utils.cpp | 6 +++++ src/sql/resolver/expr/ob_raw_expr_util.cpp | 23 +++++++++++++++++++ src/sql/resolver/expr/ob_raw_expr_util.h | 1 + 3 files changed, 30 insertions(+) diff --git a/src/sql/resolver/dml/ob_default_value_utils.cpp b/src/sql/resolver/dml/ob_default_value_utils.cpp index 702a7795b2..64c7b1daee 100644 --- a/src/sql/resolver/dml/ob_default_value_utils.cpp +++ b/src/sql/resolver/dml/ob_default_value_utils.cpp @@ -473,6 +473,7 @@ int ObDefaultValueUtils::build_expr_default_expr(const ColumnItem *column, { int ret = OB_SUCCESS; ObRawExpr *temp_expr = NULL; + ObRawExpr *seq_expr = nullptr; if (OB_ISNULL(column)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguemnt", K(column)); @@ -483,6 +484,11 @@ int ObDefaultValueUtils::build_expr_default_expr(const ColumnItem *column, input_expr, temp_expr))) { LOG_WARN("failed to copy expr", K(ret)); + } else if (OB_FAIL(ObRawExprUtils::extract_invalid_sequence_expr(temp_expr, seq_expr))) { + LOG_WARN("fail to get invalid sequence expr", K(ret)); + } else if (nullptr != seq_expr) { + ret = OB_ERR_SEQ_NOT_EXIST; + LOG_WARN("sequence not exist", K(ret)); } else { const_expr = temp_expr; } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index cbf5d584c7..27d192a372 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -3672,6 +3672,29 @@ int ObRawExprUtils::extract_column_exprs(ObRawExpr* expr, return ret; } +int ObRawExprUtils::extract_invalid_sequence_expr(ObRawExpr *raw_expr, + ObRawExpr *&sequence_expr) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(raw_expr)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid raw expr", K(ret), K(raw_expr)); + } else if (T_FUN_SYS_SEQ_NEXTVAL == raw_expr->get_expr_type() + && reinterpret_cast(raw_expr)->get_sequence_id() + == OB_INVALID_ID) { + sequence_expr = raw_expr; + } else { + int64_t N = raw_expr->get_param_count(); + for (int64_t i = 0; OB_SUCC(ret) && i < N; ++i) { + if (OB_FAIL(SMART_CALL(extract_invalid_sequence_expr(raw_expr->get_param_expr(i), + sequence_expr)))) { + LOG_WARN("failed to extract invalid sequence expr", K(ret)); + } + } + } + return ret; +} + int ObRawExprUtils::extract_col_aggr_winfunc_exprs(ObIArray &exprs, ObIArray &column_aggr_winfunc_exprs) { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 9892fd2d2d..90a43b9d3a 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -433,6 +433,7 @@ public: static int extract_contain_exprs(ObRawExpr *raw_expr, const common::ObIArray &src_exprs, common::ObIArray &contain_exprs); + static int extract_invalid_sequence_expr(ObRawExpr *raw_expr, ObRawExpr *&sequence_expr); static int mark_column_explicited_reference(ObRawExpr &expr); static int extract_column_ids(const ObIArray &exprs, common::ObIArray &column_ids); static int extract_column_ids(const ObRawExpr *raw_expr, common::ObIArray &column_ids);