diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 9c68374e2f..c22a0b224b 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -8039,7 +8039,17 @@ int ObDDLService::modify_generated_column_local_vars(ObColumnSchemaV2 &generated ObExprResType dst_type; dst_type.set_meta(generated_column.get_meta_type()); dst_type.set_accuracy(generated_column.get_accuracy()); - if (OB_FAIL(ObRawExprUtils::erase_operand_implicit_cast(expr, expr))) { + ObSQLMode sql_mode = default_session.get_sql_mode(); + if (NULL != local_session_var) { + share::schema::ObSessionSysVar *sys_var = NULL; + if (OB_FAIL(local_session_var->get_local_var(share::SYS_VAR_SQL_MODE, sys_var))) { + LOG_WARN("fail to get sys var", K(ret)); + } else if (NULL != sys_var) { + sql_mode = sys_var->val_.get_uint64(); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ObRawExprUtils::erase_operand_implicit_cast(expr, expr))) { LOG_WARN("erase implicit cast failed", K(ret)); } else if (OB_ISNULL(expr)) { ret = OB_ERR_UNEXPECTED; @@ -8061,7 +8071,7 @@ int ObDDLService::modify_generated_column_local_vars(ObColumnSchemaV2 &generated OB_INVALID_INDEX_INT64))) { LOG_WARN("expr formalize failed", K(ret)); } else if (OB_FAIL(ObRawExprUtils::extract_local_vars_for_gencol(expr_with_implicit_cast, - default_session.get_sql_mode(), + sql_mode, generated_column))) { LOG_WARN("extract sysvar from expr failed", K(ret)); } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index aec2dd5738..9a11bf36bf 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -9080,10 +9080,16 @@ int ObRawExprUtils::extract_local_vars_for_gencol(ObRawExpr *expr, } if (has_char_dep_col) { //add sql mode - ObSessionSysVar *local_var = NULL; - if (OB_FAIL(gen_col.get_local_session_var().get_local_var(SYS_VAR_SQL_MODE, local_var))) { - LOG_WARN("get local var failed", K(ret)); - } else if (NULL == local_var) { + bool is_sql_mode_solidified = false; + for (int64_t i = 0; OB_SUCC(ret) && !is_sql_mode_solidified && i < var_array.count(); ++i) { + if (OB_ISNULL(var_array.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (share::SYS_VAR_SQL_MODE == var_array.at(i)->type_) { + is_sql_mode_solidified = true; + } + } + if (OB_SUCC(ret) && !is_sql_mode_solidified) { local_sql_mode.type_ = SYS_VAR_SQL_MODE; local_sql_mode.val_.set_uint64(sql_mode); if (OB_FAIL(var_array.push_back(&local_sql_mode))) {