!1979 提升numeric减法运算的性能

Merge pull request !1979 from junhangis/junhangis/performance/numeric_subtraction
This commit is contained in:
opengauss-bot
2022-08-29 12:05:25 +00:00
committed by Gitee

View File

@ -2174,7 +2174,7 @@ Datum numeric_sub(PG_FUNCTION_ARGS)
init_var_from_num(num1, &arg1);
init_var_from_num(num2, &arg2);
init_var(&result);
quick_init_var(&result);
sub_var(&arg1, &arg2, &result);
res = make_result(&result);
@ -6731,6 +6731,7 @@ static void sub_abs(NumericVar* var1, NumericVar* var2, NumericVar* result)
int var2ndigits = var2->ndigits;
NumericDigit* var1digits = var1->digits;
NumericDigit* var2digits = var2->digits;
NumericDigit tdig[NUMERIC_LOCAL_NDIG];
res_weight = var1->weight;
@ -6746,7 +6747,10 @@ static void sub_abs(NumericVar* var1, NumericVar* var2, NumericVar* result)
res_ndigits = 1;
}
res_buf = digitbuf_alloc(res_ndigits + 1);
res_buf = tdig;
if (res_ndigits > NUMERIC_LOCAL_NMAX) {
res_buf = digitbuf_alloc(res_ndigits + 1);
}
res_buf[0] = 0; /* spare digit for later rounding */
res_digits = res_buf + 1;
@ -6773,8 +6777,18 @@ static void sub_abs(NumericVar* var1, NumericVar* var2, NumericVar* result)
digitbuf_free(result);
result->ndigits = res_ndigits;
result->buf = res_buf;
result->digits = res_digits;
if (res_buf != tdig)
{
result->buf = res_buf;
result->digits = res_digits;
} else {
result->buf = result->ndb;
result->digits = result->buf;
errno_t rc = memcpy_s(result->buf, sizeof(NumericDigit) * (res_ndigits + 1),
res_buf, sizeof(NumericDigit) * (res_ndigits + 1));
securec_check(rc, "\0", "\0");
result->digits ++;
}
result->weight = res_weight;
result->dscale = res_dscale;