Fix stack overflow of recursive printing raw_expr
This commit is contained in:
@ -53,6 +53,27 @@ class ObRawExprFactory;
|
|||||||
class ObSelectStmt;
|
class ObSelectStmt;
|
||||||
extern ObRawExpr *USELESS_POINTER;
|
extern ObRawExpr *USELESS_POINTER;
|
||||||
|
|
||||||
|
// If is_stack_overflow is true, the printing will not continue
|
||||||
|
#define DEFINE_VIRTUAL_TO_STRING_CHECK_STACK_OVERFLOW(body) \
|
||||||
|
DECLARE_VIRTUAL_TO_STRING \
|
||||||
|
{ \
|
||||||
|
int ret = common::OB_SUCCESS; \
|
||||||
|
int64_t pos = 0; \
|
||||||
|
bool is_stack_overflow = false; \
|
||||||
|
if (OB_FAIL(check_stack_overflow(is_stack_overflow))) { \
|
||||||
|
SQL_RESV_LOG(WARN, "failed to check stack overflow", K(ret), K(is_stack_overflow)); \
|
||||||
|
} else if (is_stack_overflow) { \
|
||||||
|
SQL_RESV_LOG(DEBUG, "too deep recursive", K(ret), K(is_stack_overflow)); \
|
||||||
|
} else { \
|
||||||
|
J_OBJ_START(); \
|
||||||
|
body; \
|
||||||
|
J_OBJ_END(); \
|
||||||
|
} \
|
||||||
|
return pos; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(args...) DEFINE_VIRTUAL_TO_STRING_CHECK_STACK_OVERFLOW(J_KV(args))
|
||||||
|
|
||||||
// ObSqlBitSet is a simple bitset, in order to avoid memory explosure
|
// ObSqlBitSet is a simple bitset, in order to avoid memory explosure
|
||||||
// ObBitSet is too large just for a simple bitset
|
// ObBitSet is too large just for a simple bitset
|
||||||
const static int64_t DEFAULT_SQL_BITSET_SIZE = 32;
|
const static int64_t DEFAULT_SQL_BITSET_SIZE = 32;
|
||||||
@ -2382,7 +2403,7 @@ public:
|
|||||||
virtual uint64_t hash_internal(uint64_t seed) const override;
|
virtual uint64_t hash_internal(uint64_t seed) const override;
|
||||||
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
||||||
virtual bool same_as(const ObRawExpr &expr, ObExprEqualCheckContext *check_context = NULL) const override;
|
virtual bool same_as(const ObRawExpr &expr, ObExprEqualCheckContext *check_context = NULL) const override;
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_, N_VALUE,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_, N_VALUE,
|
||||||
ref_expr_, K_(enum_set_values));
|
ref_expr_, K_(enum_set_values));
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -2538,8 +2559,8 @@ public:
|
|||||||
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
||||||
int get_subquery_comparison_name(
|
int get_subquery_comparison_name(
|
||||||
const common::ObString &symbol, char *buf, int64_t buf_len, int64_t &pos, ExplainType type) const;
|
const common::ObString &symbol, char *buf, int64_t buf_len, int64_t &pos, ExplainType type) const;
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_,
|
||||||
K_(expr_levels), N_CHILDREN, exprs_);
|
N_REL_ID, rel_ids_, K_(expr_levels), N_CHILDREN, exprs_);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
common::ObSEArray<ObRawExpr *, COMMON_MULTI_NUM, common::ModulePageAllocator, true> exprs_;
|
common::ObSEArray<ObRawExpr *, COMMON_MULTI_NUM, common::ModulePageAllocator, true> exprs_;
|
||||||
@ -2706,7 +2727,7 @@ public:
|
|||||||
virtual uint64_t hash_internal(uint64_t seed) const override;
|
virtual uint64_t hash_internal(uint64_t seed) const override;
|
||||||
|
|
||||||
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
||||||
K_(expr_levels), N_ARG_CASE, arg_expr_, N_DEFAULT, default_expr_, N_WHEN, when_exprs_, N_THEN, then_exprs_,
|
K_(expr_levels), N_ARG_CASE, arg_expr_, N_DEFAULT, default_expr_, N_WHEN, when_exprs_, N_THEN, then_exprs_,
|
||||||
N_DECODE, is_decode_func_);
|
N_DECODE, is_decode_func_);
|
||||||
|
|
||||||
@ -3003,9 +3024,10 @@ public:
|
|||||||
|
|
||||||
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
||||||
const char *get_name_dblink(ObItemType expr_type) const;
|
const char *get_name_dblink(ObItemType expr_type) const;
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_,
|
||||||
K_(expr_level), K_(expr_levels), N_CHILDREN, real_param_exprs_, N_DISTINCT, distinct_, N_ORDER_BY, order_items_,
|
N_REL_ID, rel_ids_, K_(expr_level), K_(expr_levels), N_CHILDREN, real_param_exprs_, N_DISTINCT, distinct_,
|
||||||
N_SEPARATOR_PARAM_EXPR, separator_param_expr_, K_(udf_meta), N_LINEAR_INTER_EXPR, linear_inter_expr_);
|
N_ORDER_BY, order_items_, N_SEPARATOR_PARAM_EXPR, separator_param_expr_, K_(udf_meta), N_LINEAR_INTER_EXPR,
|
||||||
|
linear_inter_expr_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(ObAggFunRawExpr);
|
DISALLOW_COPY_AND_ASSIGN(ObAggFunRawExpr);
|
||||||
@ -3163,8 +3185,8 @@ public:
|
|||||||
return operator_id_;
|
return operator_id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_,
|
||||||
K_(expr_levels), N_FUNC, func_name_, N_CHILDREN, exprs_, K_(enum_set_values));
|
N_REL_ID, rel_ids_, K_(expr_levels), N_FUNC, func_name_, N_CHILDREN, exprs_, K_(enum_set_values));
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int check_param_num_internal(int32_t param_num, int32_t param_count, ObExprOperatorType type);
|
int check_param_num_internal(int32_t param_num, int32_t param_count, ObExprOperatorType type);
|
||||||
@ -3256,12 +3278,12 @@ public:
|
|||||||
{
|
{
|
||||||
is_sqlcode_ = is_sqlcode;
|
is_sqlcode_ = is_sqlcode;
|
||||||
}
|
}
|
||||||
bool get_is_sqlcode()
|
bool get_is_sqlcode() const
|
||||||
{
|
{
|
||||||
return is_sqlcode_;
|
return is_sqlcode_;
|
||||||
}
|
}
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_,
|
||||||
K_(expr_level), K_(expr_levels), K_(is_sqlcode), N_CHILDREN, exprs_);
|
N_REL_ID, rel_ids_, K_(expr_level), K_(expr_levels), K_(is_sqlcode), N_CHILDREN, exprs_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(ObPLSQLCodeSQLErrmRawExpr);
|
DISALLOW_COPY_AND_ASSIGN(ObPLSQLCodeSQLErrmRawExpr);
|
||||||
@ -3862,7 +3884,7 @@ public:
|
|||||||
virtual uint64_t hash_internal(uint64_t seed) const override;
|
virtual uint64_t hash_internal(uint64_t seed) const override;
|
||||||
|
|
||||||
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
int get_name_internal(char *buf, const int64_t buf_len, int64_t &pos, ExplainType type) const override;
|
||||||
VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
VIRTUAL_TO_STRING_KV_CHECK_STACK_OVERFLOW(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_,
|
||||||
K_(expr_level), K_(expr_levels), K_(func_type), K_(is_distinct), K_(func_params), K_(partition_exprs),
|
K_(expr_level), K_(expr_levels), K_(func_type), K_(is_distinct), K_(func_params), K_(partition_exprs),
|
||||||
K_(order_items), K_(win_type), K_(is_between), K_(upper), K_(lower), KPC_(agg_expr));
|
K_(order_items), K_(win_type), K_(is_between), K_(upper), K_(lower), KPC_(agg_expr));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user