diff --git a/src/sql/engine/aggregate/ob_aggregate_processor.cpp b/src/sql/engine/aggregate/ob_aggregate_processor.cpp index 90b14e5ca5..2bcee9ef8f 100644 --- a/src/sql/engine/aggregate/ob_aggregate_processor.cpp +++ b/src/sql/engine/aggregate/ob_aggregate_processor.cpp @@ -3122,11 +3122,16 @@ int ObAggregateCalcFunc::add_calc(const ObDatum& left_value, const ObDatum& righ break; } case ObNumberTC: { - if (left_value.is_null() && OB_FAIL(clone_number_cell(right_value.get_number(), result_datum, out_allocator))) { - LOG_WARN("fail to clone number cell", K(ret)); - } else if (right_value.is_null() && - OB_FAIL(clone_number_cell(left_value.get_number(), result_datum, out_allocator))) { - LOG_WARN("fail to clone number cell", K(ret)); + if (left_value.is_null()) { + if (OB_FAIL(clone_number_cell(right_value.get_number(), + result_datum, out_allocator))) { + LOG_WARN("fail to clone number cell", K(ret)); + } + } else if (right_value.is_null()) { + if (OB_FAIL(clone_number_cell(left_value.get_number(), + result_datum, out_allocator))) { + LOG_WARN("fail to clone number cell", K(ret)); + } } else { char buf_alloc[ObNumber::MAX_CALC_BYTE_LEN]; ObDataBuffer allocator(buf_alloc, ObNumber::MAX_CALC_BYTE_LEN); diff --git a/src/sql/engine/window_function/ob_window_function_op.cpp b/src/sql/engine/window_function/ob_window_function_op.cpp index 3c266853a1..9507828d0a 100644 --- a/src/sql/engine/window_function/ob_window_function_op.cpp +++ b/src/sql/engine/window_function/ob_window_function_op.cpp @@ -1364,7 +1364,12 @@ int ObWindowFunctionOp::parallel_winbuf_process() ObDatum& l_datum = new_row->cells()[idx]; const ObDatum& r_datum = row->cells()[idx]; ObDatumCmpFuncType cmp_func = cmp_funcs.at(cmp_index); - if (cmp_func(l_datum, r_datum) < 0) { + // null-last cmp func should ignore null in max calc + if (r_datum.is_null() && !l_datum.is_null()) { + /*do nothing*/ + } else if (!r_datum.is_null() && l_datum.is_null()) { + l_datum = r_datum; + } else if (cmp_func(l_datum, r_datum) < 0) { l_datum = r_datum; } cmp_index++; @@ -1374,6 +1379,7 @@ int ObWindowFunctionOp::parallel_winbuf_process() ObDatum& l_datum = new_row->cells()[idx]; const ObDatum& r_datum = row->cells()[idx]; ObDatumCmpFuncType cmp_func = cmp_funcs.at(cmp_index); + // null-last cmp func no need null special calc in min calc if (cmp_func(l_datum, r_datum) > 0) { l_datum = r_datum; }