fix win expr order incorrect cause 4016 error
This commit is contained in:
		@ -5887,15 +5887,33 @@ int ObSelectLogPlan::adjust_window_functions(const ObLogicalOperator *top,
 | 
				
			|||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const EqualSets &equal_sets = top->get_output_equal_sets();
 | 
					    const EqualSets &equal_sets = top->get_output_equal_sets();
 | 
				
			||||||
    ObSEArray<std::pair<int64_t, int64_t>, 8> expr_entries;
 | 
					    ObSEArray<std::pair<int64_t, int64_t>, 8> expr_entries;
 | 
				
			||||||
 | 
					    bool is_const = false;
 | 
				
			||||||
 | 
					    ObSEArray<ObRawExpr*, 4> simplified_exprs;
 | 
				
			||||||
    for (int64_t i = 0; OB_SUCC(ret) && i < winfunc_exprs.count(); ++i) {
 | 
					    for (int64_t i = 0; OB_SUCC(ret) && i < winfunc_exprs.count(); ++i) {
 | 
				
			||||||
      int64_t non_const_exprs = 0;
 | 
					      int64_t non_const_exprs = 0;
 | 
				
			||||||
      if (OB_FAIL(ObOptimizerUtil::get_non_const_expr_size(winfunc_exprs.at(i)->get_partition_exprs(),
 | 
					      simplified_exprs.reuse();
 | 
				
			||||||
                                                           equal_sets,
 | 
					      if (OB_ISNULL(winfunc_exprs.at(i))) {
 | 
				
			||||||
                                                           top->get_output_const_exprs(),
 | 
					        ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
                                                           get_onetime_query_refs(),
 | 
					        LOG_WARN("get unexpected null", K(ret));
 | 
				
			||||||
                                                           non_const_exprs))) {
 | 
					      } else if (OB_FAIL(ObOptimizerUtil::simplify_exprs(top->get_fd_item_set(),
 | 
				
			||||||
        LOG_WARN("failed to get non const expr size", K(ret));
 | 
					                                                         equal_sets,
 | 
				
			||||||
      } else if (OB_FAIL(expr_entries.push_back(std::pair<int64_t, int64_t>(-non_const_exprs, i)))) {
 | 
					                                                         top->get_output_const_exprs(),
 | 
				
			||||||
 | 
					                                                         winfunc_exprs.at(i)->get_partition_exprs(),
 | 
				
			||||||
 | 
					                                                         simplified_exprs))) {
 | 
				
			||||||
 | 
					        LOG_WARN("failed to simplify exprs", K(ret));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      for (int64_t j = 0; OB_SUCC(ret) && j < simplified_exprs.count(); ++j) {
 | 
				
			||||||
 | 
					        if (OB_FAIL(ObOptimizerUtil::is_const_expr(simplified_exprs.at(j),
 | 
				
			||||||
 | 
					                                                   equal_sets,
 | 
				
			||||||
 | 
					                                                   top->get_output_const_exprs(),
 | 
				
			||||||
 | 
					                                                   get_onetime_query_refs(),
 | 
				
			||||||
 | 
					                                                   is_const))) {
 | 
				
			||||||
 | 
					          LOG_WARN("failed to check is const expr", K(ret));
 | 
				
			||||||
 | 
					        } else if (!is_const) {
 | 
				
			||||||
 | 
					          ++non_const_exprs;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (OB_SUCC(ret) && OB_FAIL(expr_entries.push_back(std::pair<int64_t, int64_t>(-non_const_exprs, i)))) {
 | 
				
			||||||
        LOG_WARN("faield to push back expr entry", K(ret));
 | 
					        LOG_WARN("faield to push back expr entry", K(ret));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user