fix 56 bit hash val leading to wrong ndv estimated.
This commit is contained in:
		@ -816,7 +816,7 @@ public:
 | 
				
			|||||||
      SQL_ENG_LOG(WARN, "invalid null buckets", K(ret), K(buckets_));
 | 
					      SQL_ENG_LOG(WARN, "invalid null buckets", K(ret), K(buckets_));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    for (int64_t i = 0; OB_SUCC(ret) && i < get_bucket_num(); i++) {
 | 
					    for (int64_t i = 0; OB_SUCC(ret) && i < get_bucket_num(); i++) {
 | 
				
			||||||
      if (OB_FAIL(cb(buckets_->at(i).get_hash()))) {
 | 
					      if (buckets_->at(i).is_valid() && OB_FAIL(cb(buckets_->at(i).get_hash()))) {
 | 
				
			||||||
        SQL_ENG_LOG(WARN, "call back failed", K(ret));
 | 
					        SQL_ENG_LOG(WARN, "call back failed", K(ret));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -449,6 +449,7 @@ int ObHashGroupByOp::inner_rescan()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  reset();
 | 
					  reset();
 | 
				
			||||||
 | 
					  llc_est_.reset();
 | 
				
			||||||
  if (OB_FAIL(ObGroupByOp::inner_rescan())) {
 | 
					  if (OB_FAIL(ObGroupByOp::inner_rescan())) {
 | 
				
			||||||
    LOG_WARN("failed to rescan", K(ret));
 | 
					    LOG_WARN("failed to rescan", K(ret));
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -377,6 +377,7 @@ int ObHashGroupByVecOp::inner_rescan()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  reset(true);
 | 
					  reset(true);
 | 
				
			||||||
 | 
					  llc_est_.reset();
 | 
				
			||||||
  if (OB_FAIL(ObGroupByVecOp::inner_rescan())) {
 | 
					  if (OB_FAIL(ObGroupByVecOp::inner_rescan())) {
 | 
				
			||||||
    LOG_WARN("failed to rescan", K(ret));
 | 
					    LOG_WARN("failed to rescan", K(ret));
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
@ -977,6 +978,10 @@ int ObHashGroupByVecOp::inner_get_next_batch(const int64_t max_row_cnt)
 | 
				
			|||||||
        bypass_ctrl_.reset_state();
 | 
					        bypass_ctrl_.reset_state();
 | 
				
			||||||
        by_pass_vec_holder_.restore();
 | 
					        by_pass_vec_holder_.restore();
 | 
				
			||||||
        calc_avg_group_mem();
 | 
					        calc_avg_group_mem();
 | 
				
			||||||
 | 
					        if (llc_est_.enabled_ && llc_est_.est_cnt_ != agged_group_cnt_) {
 | 
				
			||||||
 | 
					          ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
 | 
					          LOG_WARN("unexpected est_cnt number", K(ret), K(agged_group_cnt_), K(agged_row_cnt_), K(llc_est_.est_cnt_));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (!bypass_ctrl_.by_passing()) {
 | 
					      if (!bypass_ctrl_.by_passing()) {
 | 
				
			||||||
        if (OB_FAIL(by_pass_restart_round())) {
 | 
					        if (OB_FAIL(by_pass_restart_round())) {
 | 
				
			||||||
@ -1226,18 +1231,8 @@ int ObHashGroupByVecOp::load_data_batch(int64_t max_row_cnt)
 | 
				
			|||||||
  } // while end
 | 
					  } // while end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  row_store_iter.reset();
 | 
					  row_store_iter.reset();
 | 
				
			||||||
  if (OB_SUCC(ret) && llc_est_.enabled_) {
 | 
					  if (OB_SUCC(ret) && llc_est_.enabled_ && local_group_rows_.is_sstr_aggr_valid()) {
 | 
				
			||||||
    if (local_group_rows_.is_sstr_aggr_valid()) {
 | 
					    llc_est_.enabled_ = false;// do not need llc, ndv must less then 65535
 | 
				
			||||||
      llc_est_.enabled_ = false;// do not need llc, ndv must less then 65535
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      AddLlcCallback cb_func(&llc_est_);
 | 
					 | 
				
			||||||
      if (OB_FAIL(local_group_rows_.foreach_bucket_hash(cb_func))) {
 | 
					 | 
				
			||||||
        LOG_WARN("add hash val from local_group_rows_ to llc_est_ failed", K(ret));
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        llc_est_.est_cnt_ += agged_row_cnt_;
 | 
					 | 
				
			||||||
        LOG_TRACE("llc map succ to add hash val from insert state", K(ret), K(llc_est_.est_cnt_), K(agged_row_cnt_), K(agged_group_cnt_));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (OB_FAIL(ret)) {
 | 
					  if (OB_FAIL(ret)) {
 | 
				
			||||||
  } else if (NULL == cur_part && !use_distinct_data_ && OB_FAIL(finish_insert_distinct_data())) {
 | 
					  } else if (NULL == cur_part && !use_distinct_data_ && OB_FAIL(finish_insert_distinct_data())) {
 | 
				
			||||||
@ -1591,6 +1586,13 @@ int ObHashGroupByVecOp::batch_process_duplicate_data(
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      force_check_dump = false;
 | 
					      force_check_dump = false;
 | 
				
			||||||
      new_group_cnt = agged_group_cnt_ - orign_agged_group_cnt;
 | 
					      new_group_cnt = agged_group_cnt_ - orign_agged_group_cnt;
 | 
				
			||||||
 | 
					      if (OB_SUCC(ret) && llc_est_.enabled_) {
 | 
				
			||||||
 | 
					        for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; i++) {
 | 
				
			||||||
 | 
					          if (batch_new_rows_[i]) {
 | 
				
			||||||
 | 
					            llc_add_value(hash_vals_[i]);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      if (OB_SUCC(ret) && 0 < new_group_cnt) {
 | 
					      if (OB_SUCC(ret) && 0 < new_group_cnt) {
 | 
				
			||||||
        int64_t curr_cnt = 0;
 | 
					        int64_t curr_cnt = 0;
 | 
				
			||||||
        for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; i++) {
 | 
					        for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; i++) {
 | 
				
			||||||
@ -1866,6 +1868,13 @@ int ObHashGroupByVecOp::group_child_batch_rows(const ObCompactRow **store_rows,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    force_check_dump = false;
 | 
					    force_check_dump = false;
 | 
				
			||||||
    new_groups = agged_group_cnt_ - orign_agged_group_cnt;
 | 
					    new_groups = agged_group_cnt_ - orign_agged_group_cnt;
 | 
				
			||||||
 | 
					    if (OB_SUCC(ret) && llc_est_.enabled_) {
 | 
				
			||||||
 | 
					      for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; i++) {
 | 
				
			||||||
 | 
					        if (batch_new_rows_[i]) {
 | 
				
			||||||
 | 
					          llc_add_value(hash_vals_[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (OB_SUCC(ret) && new_groups > 0) {
 | 
					    if (OB_SUCC(ret) && new_groups > 0) {
 | 
				
			||||||
      int64_t curr_cnt = 0;
 | 
					      int64_t curr_cnt = 0;
 | 
				
			||||||
      for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; ++i) {
 | 
					      for (int64_t i = 0; OB_SUCC(ret) && i < child_brs.size_; ++i) {
 | 
				
			||||||
 | 
				
			|||||||
@ -47,21 +47,6 @@ public:
 | 
				
			|||||||
  static constexpr const double GLOBAL_BOUND_RATIO_ = 0.8;
 | 
					  static constexpr const double GLOBAL_BOUND_RATIO_ = 0.8;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AddLlcCallback
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
  explicit AddLlcCallback(LlcEstimate *llc_est_ptr) { llc_est_ptr_ = llc_est_ptr; }
 | 
					 | 
				
			||||||
  AddLlcCallback() = delete;
 | 
					 | 
				
			||||||
  virtual ~AddLlcCallback() = default;
 | 
					 | 
				
			||||||
  int operator()(uint64_t hash_val) {
 | 
					 | 
				
			||||||
    // for performance, do not check if llc_est_ptr_ is NULL ptr or not
 | 
					 | 
				
			||||||
    ObAggregateProcessor::llc_add_value(hash_val, llc_est_ptr_->llc_map_);
 | 
					 | 
				
			||||||
    return OB_SUCCESS;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
  LlcEstimate *llc_est_ptr_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ObGroupByDupColumnPairVec
 | 
					struct ObGroupByDupColumnPairVec
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  OB_UNIS_VERSION_V(1);
 | 
					  OB_UNIS_VERSION_V(1);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user