[CP] Fix cume_dist/percent_rank bug
This commit is contained in:
		| @ -894,8 +894,8 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, | |||||||
|     ObDatum &expr_datum = wf_info_.expr_->locate_datum_for_write(op_.eval_ctx_); |     ObDatum &expr_datum = wf_info_.expr_->locate_datum_for_write(op_.eval_ctx_); | ||||||
|     wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); |     wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); | ||||||
|     if (T_WIN_FUN_PERCENT_RANK == wf_info_.func_type_) { |     if (T_WIN_FUN_PERCENT_RANK == wf_info_.func_type_) { | ||||||
|       if (is_oracle_mode()) { |       if (ob_is_number_tc(wf_info_.expr_->datum_meta_.type_)) { | ||||||
|         // result will be zero when only one row within frame |         //in mysql mode, percent rank may return double | ||||||
|         if (0 == frame.tail_ - frame.head_) { |         if (0 == frame.tail_ - frame.head_) { | ||||||
|           number::ObNumber res_nmb; |           number::ObNumber res_nmb; | ||||||
|           res_nmb.set_zero(); |           res_nmb.set_zero(); | ||||||
| @ -915,7 +915,7 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, | |||||||
|             expr_datum.set_number(res_nmb); |             expr_datum.set_number(res_nmb); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } else { |       } else if (ObDoubleType == wf_info_.expr_->datum_meta_.type_) { | ||||||
|         if (0 == frame.tail_ - frame.head_) { |         if (0 == frame.tail_ - frame.head_) { | ||||||
|           expr_datum.set_double(0); |           expr_datum.set_double(0); | ||||||
|         } else { |         } else { | ||||||
| @ -923,6 +923,9 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, | |||||||
|           double denominator= static_cast<double>(frame.tail_ - frame.head_); |           double denominator= static_cast<double>(frame.tail_ - frame.head_); | ||||||
|           expr_datum.set_double(numerator / denominator); |           expr_datum.set_double(numerator / denominator); | ||||||
|         } |         } | ||||||
|  |       } else { | ||||||
|  |         ret = OB_ERR_UNEXPECTED; | ||||||
|  |         LOG_WARN("the result type of window function is unexpected", K(ret), K(wf_info_.expr_->datum_meta_)); | ||||||
|       } |       } | ||||||
|     } else if (lib::is_oracle_mode()) { |     } else if (lib::is_oracle_mode()) { | ||||||
|       number::ObNumber res_nmb; |       number::ObNumber res_nmb; | ||||||
| @ -1002,7 +1005,7 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   if (OB_SUCC(ret)) { |   if (OB_SUCC(ret)) { | ||||||
|     if (is_oracle_mode()) { |     if (ob_is_number_tc(wf_info_.expr_->datum_meta_.type_)) { | ||||||
|       // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) |       // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) | ||||||
|       number::ObNumber numerator; |       number::ObNumber numerator; | ||||||
|       // total tuple of current window |       // total tuple of current window | ||||||
| @ -1022,7 +1025,7 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, | |||||||
|         expr_datum.set_number(res_nmb); |         expr_datum.set_number(res_nmb); | ||||||
|         val = static_cast<ObDatum &>(expr_datum); |         val = static_cast<ObDatum &>(expr_datum); | ||||||
|       } |       } | ||||||
|     } else { |     } else if (ObDoubleType == wf_info_.expr_->datum_meta_.type_) { | ||||||
|       // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) |       // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) | ||||||
|       double numerator; |       double numerator; | ||||||
|       // total tuple of current window |       // total tuple of current window | ||||||
| @ -1033,6 +1036,9 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, | |||||||
|       wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); |       wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); | ||||||
|       expr_datum.set_double(numerator / denominator); |       expr_datum.set_double(numerator / denominator); | ||||||
|       val = static_cast<ObDatum &>(expr_datum); |       val = static_cast<ObDatum &>(expr_datum); | ||||||
|  |     } else { | ||||||
|  |       ret = OB_ERR_UNEXPECTED; | ||||||
|  |       LOG_WARN("the result type of window function is unexpected", K(ret), K(wf_info_.expr_->datum_meta_)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | |||||||
| @ -2361,7 +2361,11 @@ int ObRawExprDeduceType::visit(ObWinFunRawExpr &expr) | |||||||
|       // @TODO : nijia.nj, 细分各种window_funciton |       // @TODO : nijia.nj, 细分各种window_funciton | ||||||
|       if (T_WIN_FUN_CUME_DIST == expr.get_func_type() || |       if (T_WIN_FUN_CUME_DIST == expr.get_func_type() || | ||||||
|           T_WIN_FUN_PERCENT_RANK == expr.get_func_type()) { |           T_WIN_FUN_PERCENT_RANK == expr.get_func_type()) { | ||||||
|         if (is_oracle_mode()) { |         const uint64_t ob_version = GET_MIN_CLUSTER_VERSION(); | ||||||
|  |         if (is_oracle_mode() || | ||||||
|  |             !((ob_version >= CLUSTER_VERSION_2277 && ob_version < CLUSTER_VERSION_3000) | ||||||
|  |               || (ob_version >= CLUSTER_VERSION_312 && ob_version < CLUSTER_VERSION_3200) | ||||||
|  |               || ob_version >= CLUSTER_VERSION_3_2_3_0)) { | ||||||
|           result_type.set_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); |           result_type.set_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); | ||||||
|           result_type.set_calc_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); |           result_type.set_calc_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); | ||||||
|           result_type.set_number(); |           result_type.set_number(); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev