diff --git a/src/sql/engine/cmd/ob_routine_executor.cpp b/src/sql/engine/cmd/ob_routine_executor.cpp index 8c768cc30d..5607194139 100644 --- a/src/sql/engine/cmd/ob_routine_executor.cpp +++ b/src/sql/engine/cmd/ob_routine_executor.cpp @@ -123,7 +123,7 @@ int ObCallProcedureExecutor::execute(ObExecContext &ctx, ObCallProcedureStmt &st } else { param.reset(); param.ObObj::reset(); - if (OB_FAIL(ObSQLUtils::calc_sql_expression_without_row(ctx, *expr, param))) { + if (OB_FAIL(calc_param(ctx, *expr, param))) { LOG_WARN("failed to calc exec param expr", K(i), K(*expr), K(ret)); } else { if (expr->get_is_pl_mock_default_expr()) { @@ -292,6 +292,21 @@ int ObCallProcedureExecutor::execute(ObExecContext &ctx, ObCallProcedureStmt &st return ret; } +int ObCallProcedureExecutor::calc_param(ObExecContext &ctx, const ObISqlExpression &expr, ObObjParam &result) +{ + int ret = OB_SUCCESS; + OZ (ObSQLUtils::calc_sql_expression_without_row(ctx, expr, result), K(expr)); + if (OB_SUCC(ret) && !result.is_ext()) { + const sql::ObExpr *new_expr = expr.get_expr(); + CK (OB_NOT_NULL(new_expr)); + OX (result.set_length(new_expr->max_length_)); + OX (result.set_precision(new_expr->datum_meta_.precision_)); + OX (result.set_scale(new_expr->datum_meta_.scale_)); + OX (result.set_length_semantics(new_expr->datum_meta_.length_semantics_)); + } + return ret; +} + int ObDropRoutineExecutor::execute(ObExecContext &ctx, ObDropRoutineStmt &stmt) { int ret = OB_SUCCESS; diff --git a/src/sql/engine/cmd/ob_routine_executor.h b/src/sql/engine/cmd/ob_routine_executor.h index d15f3ef6fe..8cac5186d9 100644 --- a/src/sql/engine/cmd/ob_routine_executor.h +++ b/src/sql/engine/cmd/ob_routine_executor.h @@ -65,7 +65,7 @@ public: ObCallProcedureExecutor() {} virtual ~ObCallProcedureExecutor() {} int execute(ObExecContext &ctx, ObCallProcedureStmt &stmt); - + int calc_param(ObExecContext &ctx, const ObISqlExpression &expr, ObObjParam &result); private: DISALLOW_COPY_AND_ASSIGN(ObCallProcedureExecutor); };