Fix dangling raw expr pointer when generating rt exprs
This commit is contained in:
		@ -59,11 +59,12 @@ int ObStaticEngineExprCG::generate(const ObRawExprUniqueSet &all_raw_exprs,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObRawExprUniqueSet flattened_raw_exprs(true);
 | 
					  ObRawExprUniqueSet flattened_raw_exprs(true);
 | 
				
			||||||
 | 
					  ObRawExprFactory expr_factory(allocator_);
 | 
				
			||||||
  if (all_raw_exprs.count() <= 0) {
 | 
					  if (all_raw_exprs.count() <= 0) {
 | 
				
			||||||
    // do nothing
 | 
					    // do nothing
 | 
				
			||||||
  } else if (OB_FAIL(flattened_raw_exprs.flatten_and_add_raw_exprs(all_raw_exprs))) {
 | 
					  } else if (OB_FAIL(flattened_raw_exprs.flatten_and_add_raw_exprs(all_raw_exprs))) {
 | 
				
			||||||
    LOG_WARN("failed to flatten raw exprs", K(ret));
 | 
					    LOG_WARN("failed to flatten raw exprs", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(generate_extra_questionmarks(flattened_raw_exprs))) {
 | 
					  } else if (OB_FAIL(generate_extra_questionmarks(flattened_raw_exprs, expr_factory))) {
 | 
				
			||||||
    LOG_WARN("generate extra question marks failed", K(ret));
 | 
					    LOG_WARN("generate extra question marks failed", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(divide_probably_local_exprs(
 | 
					  } else if (OB_FAIL(divide_probably_local_exprs(
 | 
				
			||||||
                     const_cast<ObIArray<ObRawExpr *> &>(flattened_raw_exprs.get_expr_array())))) {
 | 
					                     const_cast<ObIArray<ObRawExpr *> &>(flattened_raw_exprs.get_expr_array())))) {
 | 
				
			||||||
@ -83,9 +84,10 @@ int ObStaticEngineExprCG::generate(ObRawExpr *expr,
 | 
				
			|||||||
                                   ObExprFrameInfo &expr_info)
 | 
					                                   ObExprFrameInfo &expr_info)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  ObRawExprFactory expr_factory(allocator_);
 | 
				
			||||||
  if (OB_FAIL(flattened_raw_exprs.flatten_temp_expr(expr))) {
 | 
					  if (OB_FAIL(flattened_raw_exprs.flatten_temp_expr(expr))) {
 | 
				
			||||||
    LOG_WARN("failed to flatten raw exprs", K(ret));
 | 
					    LOG_WARN("failed to flatten raw exprs", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(generate_extra_questionmarks(flattened_raw_exprs))) {
 | 
					  } else if (OB_FAIL(generate_extra_questionmarks(flattened_raw_exprs, expr_factory))) {
 | 
				
			||||||
    LOG_WARN("generate extra questionmarks failed", K(ret));
 | 
					    LOG_WARN("generate extra questionmarks failed", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(construct_exprs(flattened_raw_exprs.get_expr_array(),
 | 
					  } else if (OB_FAIL(construct_exprs(flattened_raw_exprs.get_expr_array(),
 | 
				
			||||||
                                     expr_info.rt_exprs_))) {
 | 
					                                     expr_info.rt_exprs_))) {
 | 
				
			||||||
@ -2010,7 +2012,8 @@ int ObStaticEngineExprCG::compute_max_batch_size(const ObRawExpr *raw_expr)
 | 
				
			|||||||
//               |- questionmark(:0)
 | 
					//               |- questionmark(:0)
 | 
				
			||||||
//          |- questionmark
 | 
					//          |- questionmark
 | 
				
			||||||
//               |- questionmark(:1)
 | 
					//               |- questionmark(:1)
 | 
				
			||||||
int ObStaticEngineExprCG::generate_extra_questionmarks(ObRawExprUniqueSet &flattened_raw_exprs)
 | 
					int ObStaticEngineExprCG::generate_extra_questionmarks(ObRawExprUniqueSet &flattened_raw_exprs,
 | 
				
			||||||
 | 
					                                                       ObRawExprFactory &expr_factory)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  if (OB_UNLIKELY(param_cnt_ <= 0)) {
 | 
					  if (OB_UNLIKELY(param_cnt_ <= 0)) {
 | 
				
			||||||
@ -2021,7 +2024,6 @@ int ObStaticEngineExprCG::generate_extra_questionmarks(ObRawExprUniqueSet &flatt
 | 
				
			|||||||
    for (int i = 0; i < param_cnt_; i++) {
 | 
					    for (int i = 0; i < param_cnt_; i++) {
 | 
				
			||||||
      gen_questionmarks_.at(i) = nullptr;
 | 
					      gen_questionmarks_.at(i) = nullptr;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ObRawExprFactory expr_factory(allocator_);
 | 
					 | 
				
			||||||
    const ObIArray<ObRawExpr *> &all_exprs = flattened_raw_exprs.get_expr_array();
 | 
					    const ObIArray<ObRawExpr *> &all_exprs = flattened_raw_exprs.get_expr_array();
 | 
				
			||||||
    for (int i = 0; OB_SUCC(ret) && i < all_exprs.count(); i++) {
 | 
					    for (int i = 0; OB_SUCC(ret) && i < all_exprs.count(); i++) {
 | 
				
			||||||
      if (OB_ISNULL(all_exprs.at(i))) {
 | 
					      if (OB_ISNULL(all_exprs.at(i))) {
 | 
				
			||||||
 | 
				
			|||||||
@ -40,6 +40,7 @@ class ObPhysicalPlan;
 | 
				
			|||||||
class ObDMLStmt;
 | 
					class ObDMLStmt;
 | 
				
			||||||
class ObRawExprUniqueSet;
 | 
					class ObRawExprUniqueSet;
 | 
				
			||||||
class ObSQLSessionInfo;
 | 
					class ObSQLSessionInfo;
 | 
				
			||||||
 | 
					class ObRawExprFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ObExprCGCtx
 | 
					class ObExprCGCtx
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -461,7 +462,7 @@ private:
 | 
				
			|||||||
  bool use_rich_format() const;
 | 
					  bool use_rich_format() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
  int generate_extra_questionmarks(ObRawExprUniqueSet &flattened_raw_exprs);
 | 
					  int generate_extra_questionmarks(ObRawExprUniqueSet &flattened_raw_exprs, ObRawExprFactory &factory);
 | 
				
			||||||
  bool is_dynamic_eval_qm(const ObRawExpr &raw_expr) const;
 | 
					  bool is_dynamic_eval_qm(const ObRawExpr &raw_expr) const;
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
  // disallow copy
 | 
					  // disallow copy
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user