80#define MUL_GUARD_DIGITS 4
81#define DIV_GUARD_DIGITS 8
90#define MUL_GUARD_DIGITS 3
91#define DIV_GUARD_DIGITS 6
98#define HALF_NBASE 5000
100#define MUL_GUARD_DIGITS 2
101#define DIV_GUARD_DIGITS 4
106#define NBASE_SQR (NBASE * NBASE)
168#define NUMERIC_SIGN_MASK 0xC000
169#define NUMERIC_POS 0x0000
170#define NUMERIC_NEG 0x4000
171#define NUMERIC_SHORT 0x8000
172#define NUMERIC_SPECIAL 0xC000
174#define NUMERIC_FLAGBITS(n) ((n)->choice.n_header & NUMERIC_SIGN_MASK)
175#define NUMERIC_IS_SHORT(n) (NUMERIC_FLAGBITS(n) == NUMERIC_SHORT)
176#define NUMERIC_IS_SPECIAL(n) (NUMERIC_FLAGBITS(n) == NUMERIC_SPECIAL)
178#define NUMERIC_HDRSZ (VARHDRSZ + sizeof(uint16) + sizeof(int16))
179#define NUMERIC_HDRSZ_SHORT (VARHDRSZ + sizeof(uint16))
186#define NUMERIC_HEADER_IS_SHORT(n) (((n)->choice.n_header & 0x8000) != 0)
187#define NUMERIC_HEADER_SIZE(n) \
188 (VARHDRSZ + sizeof(uint16) + \
189 (NUMERIC_HEADER_IS_SHORT(n) ? 0 : sizeof(int16)))
200#define NUMERIC_EXT_SIGN_MASK 0xF000
201#define NUMERIC_NAN 0xC000
202#define NUMERIC_PINF 0xD000
203#define NUMERIC_NINF 0xF000
204#define NUMERIC_INF_SIGN_MASK 0x2000
206#define NUMERIC_EXT_FLAGBITS(n) ((n)->choice.n_header & NUMERIC_EXT_SIGN_MASK)
207#define NUMERIC_IS_NAN(n) ((n)->choice.n_header == NUMERIC_NAN)
208#define NUMERIC_IS_PINF(n) ((n)->choice.n_header == NUMERIC_PINF)
209#define NUMERIC_IS_NINF(n) ((n)->choice.n_header == NUMERIC_NINF)
210#define NUMERIC_IS_INF(n) \
211 (((n)->choice.n_header & ~NUMERIC_INF_SIGN_MASK) == NUMERIC_PINF)
217#define NUMERIC_SHORT_SIGN_MASK 0x2000
218#define NUMERIC_SHORT_DSCALE_MASK 0x1F80
219#define NUMERIC_SHORT_DSCALE_SHIFT 7
220#define NUMERIC_SHORT_DSCALE_MAX \
221 (NUMERIC_SHORT_DSCALE_MASK >> NUMERIC_SHORT_DSCALE_SHIFT)
222#define NUMERIC_SHORT_WEIGHT_SIGN_MASK 0x0040
223#define NUMERIC_SHORT_WEIGHT_MASK 0x003F
224#define NUMERIC_SHORT_WEIGHT_MAX NUMERIC_SHORT_WEIGHT_MASK
225#define NUMERIC_SHORT_WEIGHT_MIN (-(NUMERIC_SHORT_WEIGHT_MASK+1))
237#define NUMERIC_DSCALE_MASK 0x3FFF
238#define NUMERIC_DSCALE_MAX NUMERIC_DSCALE_MASK
240#define NUMERIC_SIGN(n) \
241 (NUMERIC_IS_SHORT(n) ? \
242 (((n)->choice.n_short.n_header & NUMERIC_SHORT_SIGN_MASK) ? \
243 NUMERIC_NEG : NUMERIC_POS) : \
244 (NUMERIC_IS_SPECIAL(n) ? \
245 NUMERIC_EXT_FLAGBITS(n) : NUMERIC_FLAGBITS(n)))
246#define NUMERIC_DSCALE(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \
247 ((n)->choice.n_short.n_header & NUMERIC_SHORT_DSCALE_MASK) \
248 >> NUMERIC_SHORT_DSCALE_SHIFT \
249 : ((n)->choice.n_long.n_sign_dscale & NUMERIC_DSCALE_MASK))
250#define NUMERIC_WEIGHT(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \
251 (((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_SIGN_MASK ? \
252 ~NUMERIC_SHORT_WEIGHT_MASK : 0) \
253 | ((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_MASK)) \
254 : ((n)->choice.n_long.n_weight))
261#define NUMERIC_WEIGHT_MAX PG_INT16_MAX
405#define NumericAbbrevGetDatum(X) Int64GetDatum(X)
406#define DatumGetNumericAbbrev(X) DatumGetInt64(X)
407#define NUMERIC_ABBREV_NAN NumericAbbrevGetDatum(PG_INT64_MIN)
408#define NUMERIC_ABBREV_PINF NumericAbbrevGetDatum(-PG_INT64_MAX)
409#define NUMERIC_ABBREV_NINF NumericAbbrevGetDatum(PG_INT64_MAX)
474#define dump_numeric(s,n)
478#define digitbuf_alloc(ndigits) \
479 ((NumericDigit *) palloc((ndigits) * sizeof(NumericDigit)))
480#define digitbuf_free(buf) \
486#define init_var(v) memset(v, 0, sizeof(NumericVar))
488#define NUMERIC_DIGITS(num) (NUMERIC_HEADER_IS_SHORT(num) ? \
489 (num)->choice.n_short.n_data : (num)->choice.n_long.n_data)
490#define NUMERIC_NDIGITS(num) \
491 ((VARSIZE(num) - NUMERIC_HEADER_SIZE(num)) / sizeof(NumericDigit))
492#define NUMERIC_CAN_BE_SHORT(scale,weight) \
493 ((scale) <= NUMERIC_SHORT_DSCALE_MAX && \
494 (weight) <= NUMERIC_SHORT_WEIGHT_MAX && \
495 (weight) >= NUMERIC_SHORT_WEIGHT_MIN)
505 const char *cp,
int sign,
543 int var1weight,
int var1sign,
545 int var2weight,
int var2sign);
556 NumericVar *result,
int rscale,
bool round,
bool exact);
560static void div_var_int64(
const NumericVar *var,
int64 ival,
int ival_weight,
633 Node *escontext = fcinfo->context;
636 const char *numstart;
643 if (!isspace((
unsigned char) *cp))
671 if (!isdigit((
unsigned char) *cp) && *cp !=
'.')
704 if (!isspace((
unsigned char) *cp))
760 &
value, &cp, escontext))
770 if (!isspace((
unsigned char) *cp))
787 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
788 errmsg(
"invalid input syntax for type %s: \"%s\"",
871 return (
arg.ndigits == 0 ||
arg.ndigits <=
arg.weight + 1);
912 return ((typmod -
VARHDRSZ) >> 16) & 0xffff;
927 return (((typmod -
VARHDRSZ) & 0x7ff) ^ 1024) - 1024;
1033 if (strchr(
str,
'.') != NULL)
1039 last = strlen(
str) - 1;
1040 while (
str[last] ==
'0')
1044 if (
str[last] ==
'.')
1048 str[last + 1] =
'\0';
1090 (
errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
1091 errmsg(
"invalid sign in external \"numeric\" value")));
1096 (
errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
1097 errmsg(
"invalid scale in external \"numeric\" value")));
1099 for (
i = 0;
i <
len;
i++)
1103 if (d < 0 || d >=
NBASE)
1105 (
errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
1106 errmsg(
"invalid digit in external \"numeric\" value")));
1161 for (
i = 0;
i <
x.ndigits;
i++)
1213 new_scale == old_scale && new_precision >= old_precision))
1282 new->choice.n_short.n_header =
1320 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1321 errmsg(
"NUMERIC precision %d must be between 1 and %d",
1325 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1326 errmsg(
"NUMERIC scale %d must be between %d and %d",
1334 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1335 errmsg(
"NUMERIC precision %d must be between 1 and %d",
1343 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1344 errmsg(
"invalid NUMERIC type modifier")));
1355 char *res = (
char *)
palloc(64);
1709 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1710 errmsg(
"start value cannot be NaN")));
1713 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1714 errmsg(
"start value cannot be infinity")));
1720 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1721 errmsg(
"stop value cannot be NaN")));
1724 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1725 errmsg(
"stop value cannot be infinity")));
1737 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1738 errmsg(
"step size cannot be NaN")));
1741 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1742 errmsg(
"step size cannot be infinity")));
1749 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1750 errmsg(
"step size cannot equal zero")));
1850 ((
Const *) arg1)->constisnull) ||
1852 ((
Const *) arg2)->constisnull) ||
1853 (arg3 != NULL &&
IsA(arg3,
Const) &&
1854 ((
Const *) arg3)->constisnull))
1861 (arg3 == NULL ||
IsA(arg3,
Const)))
1917 div_var(&res, &step, &res, 0,
false,
false);
1963 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1964 errmsg(
"count must be greater than zero")));
1970 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1971 errmsg(
"lower and upper bounds cannot be NaN")));
1975 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1976 errmsg(
"lower and upper bounds must be finite")));
1989 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1990 errmsg(
"lower bound cannot equal upper bound")));
2019 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
2020 errmsg(
"integer out of range")));
2055 sub_var(&operand_var, &bound1_var, &operand_var);
2056 sub_var(&bound2_var, &bound1_var, &bound2_var);
2058 mul_var(&operand_var, count_var, &operand_var,
2060 div_var(&operand_var, &bound2_var, result_var, 0,
false,
true);
2198 pfree(original_varatt);
2217 if (memtupcount < 10000 || nss->input_count < 10000 || !nss->estimating)
2228 if (abbr_card > 100000.0)
2232 "numeric_abbrev: estimation ends at cardinality %f"
2248 if (abbr_card < nss->input_count / 10000.0 + 0.5)
2252 "numeric_abbrev: aborting abbreviation at cardinality %f"
2253 " below threshold %f after " INT64_FORMAT " values (%d rows)",
2261 "numeric_abbrev: cardinality %f"
2363 int weight = var->
weight;
2366 if (ndigits == 0 || weight < -44)
2370 else if (weight > 83)
2376 result = ((
int64) (weight + 44) << 56);
2596 (
errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
2597 errmsg(
"invalid preceding or following size in window function")));
2694 sub_var(&basev, &offsetv, &sum);
2696 add_var(&basev, &offsetv, &sum);
2699 result = (
cmp_var(&valv, &sum) <= 0);
2701 result = (
cmp_var(&valv, &sum) >= 0);
2784 result = digit_hash ^ weight;
2924 add_var(&arg1, &arg2, &result);
3000 sub_var(&arg1, &arg2, &result);
3175 goto division_by_zero;
3190 goto division_by_zero;
3223 goto division_by_zero;
3228 div_var(&arg1, &arg2, &result, rscale,
true,
true);
3238 errcode(ERRCODE_DIVISION_BY_ZERO),
3239 errmsg(
"division by zero"));
3273 (
errcode(ERRCODE_DIVISION_BY_ZERO),
3274 errmsg(
"division by zero")));
3291 (
errcode(ERRCODE_DIVISION_BY_ZERO),
3292 errmsg(
"division by zero")));
3322 div_var(&arg1, &arg2, &result, 0,
false,
true);
3375 goto division_by_zero;
3391 goto division_by_zero;
3393 mod_var(&arg1, &arg2, &result);
3403 errcode(ERRCODE_DIVISION_BY_ZERO),
3404 errmsg(
"division by zero"));
3525 gcd_var(&arg1, &arg2, &result);
3579 gcd_var(&arg1, &arg2, &result);
3580 div_var(&arg1, &result, &result, 0,
false,
true);
3610 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3611 errmsg(
"factorial of a negative number is undefined")));
3620 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3621 errmsg(
"value overflows numeric format")));
3628 for (num = num - 1; num > 1; num--)
3635 mul_var(&result, &fact, &result, 0);
3670 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3671 errmsg(
"cannot take square root of a negative number")));
3692#if DEC_DIGITS == ((DEC_DIGITS / 2) * 2)
3695 if (
arg.weight >= 0)
3702 rscale =
Max(rscale,
arg.dscale);
3762 val *= 0.434294481903252;
3769 rscale =
Max(rscale,
arg.dscale);
3808 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3809 errmsg(
"cannot take logarithm of a negative number")));
3821 rscale =
Max(rscale,
arg.dscale);
3863 if (sign1 < 0 || sign2 < 0)
3865 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3866 errmsg(
"cannot take logarithm of a negative number")));
3868 if (sign1 == 0 || sign2 == 0)
3870 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3871 errmsg(
"cannot take logarithm of zero")));
3896 log_var(&arg1, &arg2, &result);
3956 if (sign1 == 0 && sign2 < 0)
3958 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3959 errmsg(
"zero raised to a negative power is undefined")));
3962 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3963 errmsg(
"a negative number raised to a non-integer power yields a complex result")));
3989 if (sign1 == 0 && sign2 > 0)
4008 abs_x_gt_one =
true;
4017 if (abs_x_gt_one == (sign2 > 0))
4068 if (sign1 == 0 && sign2 < 0)
4070 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
4071 errmsg(
"zero raised to a negative power is undefined")));
4123 last_digit_pos = var->
ndigits - 1;
4124 while (last_digit_pos >= 0 &&
4125 var->
digits[last_digit_pos] == 0)
4128 if (last_digit_pos >= 0)
4145 while (last_digit % 10 == 0)
4217 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4218 errmsg(
"lower bound cannot be NaN"));
4221 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4222 errmsg(
"lower bound cannot be infinity"));
4228 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4229 errmsg(
"upper bound cannot be NaN"));
4232 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4233 errmsg(
"upper bound cannot be infinity"));
4292 rscale = log10val2 < 0 ? 0 : log10val2;
4312 static const int pow10[] = {1, 10, 100, 1000};
4313#elif DEC_DIGITS == 2
4314 static const int pow10[] = {1, 10};
4315#elif DEC_DIGITS == 1
4316 static const int pow10[] = {1};
4318#error unsupported NBASE
4374 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4375 errmsg(
"cannot convert NaN to %s",
"integer")));
4378 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4379 errmsg(
"cannot convert infinity to %s",
"integer")));
4387 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4388 errmsg(
"integer out of range")));
4444 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4445 errmsg(
"cannot convert NaN to %s",
"bigint")));
4448 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4449 errmsg(
"cannot convert infinity to %s",
"bigint")));
4457 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4458 errmsg(
"bigint out of range")));
4493 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4494 errmsg(
"cannot convert NaN to %s",
"smallint")));
4497 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4498 errmsg(
"cannot convert infinity to %s",
"smallint")));
4506 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4507 errmsg(
"smallint out of range")));
4511 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4512 errmsg(
"smallint out of range")));
4527 char buf[DBL_DIG + 100];
4621 char buf[FLT_DIG + 100];
4689 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4690 errmsg(
"cannot convert NaN to %s",
"pg_lsn")));
4693 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4694 errmsg(
"cannot convert infinity to %s",
"pg_lsn")));
4702 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4703 errmsg(
"pg_lsn out of range")));
4738#define NA_TOTAL_COUNT(na) \
4739 ((na)->N + (na)->NaNcount + (na)->pInfcount + (na)->nInfcount)
4753 elog(
ERROR,
"aggregate function called in non-aggregate context");
4758 state->calcSumX2 = calcSumX2;
4759 state->agg_context = agg_context;
4776 state->calcSumX2 = calcSumX2;
4814 state->maxScaleCount = 1;
4817 state->maxScaleCount++;
4820 if (
state->calcSumX2)
4834 if (
state->calcSumX2)
4886 if (
state->maxScaleCount > 1 ||
state->maxScale == 0)
4892 state->maxScaleCount--;
4894 else if (
state->N == 1)
4897 state->maxScale = 0;
4898 state->maxScaleCount = 0;
4908 if (
state->calcSumX2)
4923 if (
state->calcSumX2)
4936 if (
state->calcSumX2)
4977 elog(
ERROR,
"aggregate function called in non-aggregate context");
4991 state1->
N = state2->
N;
5006 state1->
N += state2->
N;
5069 elog(
ERROR,
"aggregate function called in non-aggregate context");
5083 state1->
N = state2->
N;
5097 state1->
N += state2->
N;
5142 elog(
ERROR,
"aggregate function called in non-aggregate context");
5193 elog(
ERROR,
"aggregate function called in non-aggregate context");
5252 elog(
ERROR,
"aggregate function called in non-aggregate context");
5307 elog(
ERROR,
"aggregate function called in non-aggregate context");
5368 elog(
ERROR,
"numeric_accum_inv called with NULL state");
5417 elog(
ERROR,
"aggregate function called in non-aggregate context");
5422 state->calcSumX2 = calcSumX2;
5439 state->calcSumX2 = calcSumX2;
5450 if (
state->calcSumX2)
5463 if (
state->calcSumX2)
5533 elog(
ERROR,
"aggregate function called in non-aggregate context");
5547 state1->
N = state2->
N;
5558 state1->
N += state2->
N;
5601 elog(
ERROR,
"aggregate function called in non-aggregate context");
5634 elog(
ERROR,
"aggregate function called in non-aggregate context");
5694 elog(
ERROR,
"aggregate function called in non-aggregate context");
5708 state1->
N = state2->
N;
5718 state1->
N += state2->
N;
5738 elog(
ERROR,
"aggregate function called in non-aggregate context");
5768 elog(
ERROR,
"aggregate function called in non-aggregate context");
5805 elog(
ERROR,
"int2_accum_inv called with NULL state");
5822 elog(
ERROR,
"int4_accum_inv called with NULL state");
5839 elog(
ERROR,
"int8_accum_inv called with NULL state");
5845 elog(
ERROR,
"do_numeric_discard failed unexpectedly");
5860 elog(
ERROR,
"int8_avg_accum_inv called with NULL state");
5932 if (
state->NaNcount > 0)
5936 if (
state->pInfcount > 0 &&
state->nInfcount > 0)
5938 if (
state->pInfcount > 0)
5940 if (
state->nInfcount > 0)
5966 if (
state->NaNcount > 0)
5970 if (
state->pInfcount > 0 &&
state->nInfcount > 0)
5972 if (
state->pInfcount > 0)
5974 if (
state->nInfcount > 0)
5998 bool variance,
bool sample,
6020 if (sample && totCount <= 1)
6032 if (
state->NaNcount > 0 ||
state->pInfcount > 0 ||
state->nInfcount > 0)
6048 rscale = vsumX.
dscale * 2;
6050 mul_var(&vsumX, &vsumX, &vsumX, rscale);
6051 mul_var(&vN, &vsumX2, &vsumX2, rscale);
6052 sub_var(&vsumX2, &vsumX, &vsumX2);
6062 mul_var(&vN, &vNminus1, &vNminus1, 0);
6064 mul_var(&vN, &vN, &vNminus1, 0);
6066 div_var(&vsumX2, &vNminus1, &vsumX, rscale,
true,
true);
6150 bool variance,
bool sample,
6406 elog(
ERROR,
"expected 2-element int8 array");
6434 elog(
ERROR,
"expected 2-element int8 array");
6452 elog(
ERROR,
"aggregate function called in non-aggregate context");
6459 elog(
ERROR,
"expected 2-element int8 array");
6463 elog(
ERROR,
"expected 2-element int8 array");
6469 state1->
sum += state2->
sum;
6493 elog(
ERROR,
"expected 2-element int8 array");
6521 elog(
ERROR,
"expected 2-element int8 array");
6540 elog(
ERROR,
"expected 2-element int8 array");
6544 if (transdata->
count == 0)
6565 elog(
ERROR,
"expected 2-element int8 array");
6569 if (transdata->
count == 0)
6621 for (
i = 0;
i < ndigits;
i++)
6747 bool have_dp =
false;
6749 unsigned char *decdigits;
6782 if (!isdigit((
unsigned char) *cp))
6783 goto invalid_syntax;
6793 if (isdigit((
unsigned char) *cp))
6795 decdigits[
i++] = *cp++ -
'0';
6801 else if (*cp ==
'.')
6804 goto invalid_syntax;
6809 goto invalid_syntax;
6811 else if (*cp ==
'_')
6815 if (!isdigit((
unsigned char) *cp))
6816 goto invalid_syntax;
6827 if (*cp ==
'e' || *cp ==
'E')
6845 else if (*cp ==
'-')
6852 if (!isdigit((
unsigned char) *cp))
6853 goto invalid_syntax;
6857 if (isdigit((
unsigned char) *cp))
6859 exponent = exponent * 10 + (*cp++ -
'0');
6863 else if (*cp ==
'_')
6867 if (!isdigit((
unsigned char) *cp))
6868 goto invalid_syntax;
6875 exponent = -exponent;
6877 dweight += (int) exponent;
6878 dscale -= (int) exponent;
6893 offset = (weight + 1) *
DEC_DIGITS - (dweight + 1);
6898 dest->weight = weight;
6899 dest->dscale = dscale;
6904 while (ndigits-- > 0)
6907 *
digits++ = ((decdigits[
i] * 10 + decdigits[
i + 1]) * 10 +
6908 decdigits[
i + 2]) * 10 + decdigits[
i + 3];
6909#elif DEC_DIGITS == 2
6910 *
digits++ = decdigits[
i] * 10 + decdigits[
i + 1];
6911#elif DEC_DIGITS == 1
6914#error unsupported NBASE
6931 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
6932 errmsg(
"value overflows numeric format")));
6936 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
6937 errmsg(
"invalid input syntax for type %s: \"%s\"",
6948 return dig >=
'0' && dig <=
'9' ? dig -
'0' :
6949 dig >=
'a' && dig <=
'f' ? dig -
'a' + 10 :
6950 dig >=
'A' && dig <=
'F' ? dig -
'A' + 10 : -1;
6975 const char **endptr,
Node *escontext)
6977 const char *firstdigit = cp;
6999 if (isxdigit((
unsigned char) *cp))
7021 else if (*cp ==
'_')
7025 if (!isxdigit((
unsigned char) *cp))
7026 goto invalid_syntax;
7036 if (*cp >=
'0' && *cp <=
'7')
7055 tmp = tmp * 8 + (*cp++ -
'0');
7058 else if (*cp ==
'_')
7062 if (*cp < '0' || *cp >
'7')
7063 goto invalid_syntax;
7073 if (*cp >=
'0' && *cp <=
'1')
7092 tmp = tmp * 2 + (*cp++ -
'0');
7095 else if (*cp ==
'_')
7099 if (*cp < '0' || *cp >
'1')
7100 goto invalid_syntax;
7108 goto invalid_syntax;
7112 goto invalid_syntax;
7134 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7135 errmsg(
"value overflows numeric format")));
7139 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
7140 errmsg(
"invalid input syntax for type %s: \"%s\"",
7205 if (
value->ndigits > 0)
7206 memcpy(newbuf + 1,
value->digits,
7213 dest->digits = newbuf + 1;
7272 for (d = 0; d <= var->
weight; d++)
7278 bool putit = (d > 0);
7297#elif DEC_DIGITS == 2
7300 if (d1 > 0 || d > 0)
7303#elif DEC_DIGITS == 1
7306#error unsupported NBASE
7319 endcp = cp + dscale;
7424 div_var(var, &tmp_var, &tmp_var, rscale,
true,
true);
7436 len = strlen(sig_out) + 13;
7483 for (
i = 0;
i <
len;
i++)
7499 memcpy(res, num,
VARSIZE(num));
7514 int weight = var->
weight;
7544 while (n > 0 && *
digits == 0)
7551 while (n > 0 &&
digits[n - 1] == 0)
7567 result->choice.n_short.n_header =
7579 result->choice.n_long.n_sign_dscale =
7581 result->choice.n_long.n_weight = weight;
7592 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7593 errmsg(
"value overflows numeric format")));
7668 else if (dig < 1000)
7670#elif DEC_DIGITS == 2
7673#elif DEC_DIGITS == 1
7676#error unsupported NBASE
7680 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7681 errmsg(
"numeric field overflow"),
7682 errdetail(
"A field with precision %d, scale %d must round to an absolute value less than %s%d.",
7731 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7732 errmsg(
"numeric field overflow"),
7733 errdetail(
"A field with precision %d, scale %d cannot hold an infinite value.",
7734 precision,
scale)));
7774 Assert(weight >= 0 && ndigits <= weight + 1);
7784 for (
i = 1;
i <= weight;
i++)
7851 newuval = uval /
NBASE;
7852 *ptr = uval - newuval *
NBASE;
7857 var->
weight = ndigits - 1;
7902 Assert(weight >= 0 && ndigits <= weight + 1);
7907 for (
i = 1;
i <= weight;
i++)
7965 var->
weight = ndigits - 1;
7981 val = strtod(tmp, &endptr);
7982 if (*endptr !=
'\0')
7986 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
7987 errmsg(
"invalid input syntax for type %s: \"%s\"",
7988 "double precision", tmp)));
8020 int var1weight,
int var1sign,
8022 int var2weight,
int var2sign)
8024 if (var1ndigits == 0)
8026 if (var2ndigits == 0)
8032 if (var2ndigits == 0)
8044 var2digits, var2ndigits, var2weight);
8051 var1digits, var1ndigits, var1weight);
8304 int res_ndigitpairs;
8317 int var1ndigitpairs;
8318 int var2ndigitpairs;
8347 var1digits = var1->
digits;
8348 var2digits = var2->
digits;
8350 if (var1ndigits == 0)
8362 if (var1ndigits <= 6 && rscale == var1->dscale + var2->
dscale)
8398 var1ndigitpairs = (var1ndigits + 1) / 2;
8399 var2ndigitpairs = (var2ndigits + 1) / 2;
8402 res_ndigits = var1ndigits + var2ndigits;
8405 res_ndigitpairs = res_ndigits / 2 + 1;
8408 pair_offset = res_ndigitpairs - var1ndigitpairs - var2ndigitpairs + 1;
8411 res_weight = var1->
weight + var2->
weight + 1 + 2 * res_ndigitpairs -
8412 res_ndigits - (var1ndigits & 1) - (var2ndigits & 1);
8419 res_ndigitpairs =
Min(res_ndigitpairs, maxdigitpairs);
8420 res_ndigits = 2 * res_ndigitpairs;
8428 if (res_ndigitpairs <= pair_offset)
8435 var1ndigitpairs =
Min(var1ndigitpairs, res_ndigitpairs - pair_offset);
8436 var2ndigitpairs =
Min(var2ndigitpairs, res_ndigitpairs - pair_offset);
8462 var2ndigitpairs *
sizeof(
uint32));
8465 var2digitpairs = (
uint32 *) (dig + res_ndigitpairs);
8467 for (i2 = 0; i2 < var2ndigitpairs - 1; i2++)
8468 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE + var2digits[2 * i2 + 1];
8470 if (2 * i2 + 1 < var2ndigits)
8471 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE + var2digits[2 * i2 + 1];
8473 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE;
8488 i1 = var1ndigitpairs - 1;
8489 if (2 * i1 + 1 < var1ndigits)
8490 var1digitpair = var1digits[2 * i1] *
NBASE + var1digits[2 * i1 + 1];
8492 var1digitpair = var1digits[2 * i1] *
NBASE;
8493 maxdig = var1digitpair;
8495 i2limit =
Min(var2ndigitpairs, res_ndigitpairs - i1 - pair_offset);
8496 dig_i1_off = &dig[i1 + pair_offset];
8498 memset(dig, 0, (i1 + pair_offset) *
sizeof(
uint64));
8499 for (i2 = 0; i2 < i2limit; i2++)
8500 dig_i1_off[i2] = (
uint64) var1digitpair * var2digitpairs[i2];
8507 for (i1 = i1 - 1; i1 >= 0; i1--)
8509 var1digitpair = var1digits[2 * i1] *
NBASE + var1digits[2 * i1 + 1];
8510 if (var1digitpair == 0)
8514 maxdig += var1digitpair;
8519 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
8521 newdig = dig[
i] + carry;
8533 maxdig = 1 + var1digitpair;
8537 i2limit =
Min(var2ndigitpairs, res_ndigitpairs - i1 - pair_offset);
8538 dig_i1_off = &dig[i1 + pair_offset];
8540 for (i2 = 0; i2 < i2limit; i2++)
8541 dig_i1_off[i2] += (
uint64) var1digitpair * var2digitpairs[i2];
8550 res_digits = result->
digits;
8552 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
8554 newdig = dig[
i] + carry;
8572 result->
weight = res_weight;
8573 result->
sign = res_sign;
8594 int var1ndigits = var1->
ndigits;
8595 int var2ndigits = var2->
ndigits;
8607 Assert(var1ndigits >= 1);
8608 Assert(var1ndigits <= 6);
8609 Assert(var2ndigits >= var1ndigits);
8623 res_ndigits = var1ndigits + var2ndigits;
8628 res_digits = res_buf + 1;
8635#define PRODSUM1(v1,i1,v2,i2) ((v1)[(i1)] * (v2)[(i2)])
8636#define PRODSUM2(v1,i1,v2,i2) (PRODSUM1(v1,i1,v2,i2) + (v1)[(i1)+1] * (v2)[(i2)-1])
8637#define PRODSUM3(v1,i1,v2,i2) (PRODSUM2(v1,i1,v2,i2) + (v1)[(i1)+2] * (v2)[(i2)-2])
8638#define PRODSUM4(v1,i1,v2,i2) (PRODSUM3(v1,i1,v2,i2) + (v1)[(i1)+3] * (v2)[(i2)-3])
8639#define PRODSUM5(v1,i1,v2,i2) (PRODSUM4(v1,i1,v2,i2) + (v1)[(i1)+4] * (v2)[(i2)-4])
8640#define PRODSUM6(v1,i1,v2,i2) (PRODSUM5(v1,i1,v2,i2) + (v1)[(i1)+5] * (v2)[(i2)-5])
8642 switch (var1ndigits)
8652 for (
int i = var2ndigits - 1;
i >= 0;
i--)
8654 term =
PRODSUM1(var1digits, 0, var2digits,
i) + carry;
8656 carry = term /
NBASE;
8670 term =
PRODSUM1(var1digits, 1, var2digits, var2ndigits - 1);
8672 carry = term /
NBASE;
8675 for (
int i = var2ndigits - 1;
i >= 1;
i--)
8677 term =
PRODSUM2(var1digits, 0, var2digits,
i) + carry;
8679 carry = term /
NBASE;
8692 term =
PRODSUM1(var1digits, 2, var2digits, var2ndigits - 1);
8694 carry = term /
NBASE;
8696 term =
PRODSUM2(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8698 carry = term /
NBASE;
8701 for (
int i = var2ndigits - 1;
i >= 2;
i--)
8703 term =
PRODSUM3(var1digits, 0, var2digits,
i) + carry;
8705 carry = term /
NBASE;
8718 term =
PRODSUM1(var1digits, 3, var2digits, var2ndigits - 1);
8720 carry = term /
NBASE;
8722 term =
PRODSUM2(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8724 carry = term /
NBASE;
8726 term =
PRODSUM3(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8728 carry = term /
NBASE;
8731 for (
int i = var2ndigits - 1;
i >= 3;
i--)
8733 term =
PRODSUM4(var1digits, 0, var2digits,
i) + carry;
8735 carry = term /
NBASE;
8748 term =
PRODSUM1(var1digits, 4, var2digits, var2ndigits - 1);
8750 carry = term /
NBASE;
8752 term =
PRODSUM2(var1digits, 3, var2digits, var2ndigits - 1) + carry;
8754 carry = term /
NBASE;
8756 term =
PRODSUM3(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8758 carry = term /
NBASE;
8760 term =
PRODSUM4(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8762 carry = term /
NBASE;
8765 for (
int i = var2ndigits - 1;
i >= 4;
i--)
8767 term =
PRODSUM5(var1digits, 0, var2digits,
i) + carry;
8769 carry = term /
NBASE;
8782 term =
PRODSUM1(var1digits, 5, var2digits, var2ndigits - 1);
8784 carry = term /
NBASE;
8786 term =
PRODSUM2(var1digits, 4, var2digits, var2ndigits - 1) + carry;
8788 carry = term /
NBASE;
8790 term =
PRODSUM3(var1digits, 3, var2digits, var2ndigits - 1) + carry;
8792 carry = term /
NBASE;
8794 term =
PRODSUM4(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8796 carry = term /
NBASE;
8798 term =
PRODSUM5(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8800 carry = term /
NBASE;
8803 for (
int i = var2ndigits - 1;
i >= 5;
i--)
8805 term =
PRODSUM6(var1digits, 0, var2digits,
i) + carry;
8807 carry = term /
NBASE;
8816 switch (var1ndigits)
8819 term =
PRODSUM5(var1digits, 0, var2digits, 4) + carry;
8821 carry = term /
NBASE;
8824 term =
PRODSUM4(var1digits, 0, var2digits, 3) + carry;
8826 carry = term /
NBASE;
8829 term =
PRODSUM3(var1digits, 0, var2digits, 2) + carry;
8831 carry = term /
NBASE;
8834 term =
PRODSUM2(var1digits, 0, var2digits, 1) + carry;
8836 carry = term /
NBASE;
8839 term =
PRODSUM1(var1digits, 0, var2digits, 0) + carry;
8847 result->
ndigits = res_ndigits;
8848 result->
buf = res_buf;
8849 result->
digits = res_digits;
8850 result->
weight = res_weight;
8851 result->
sign = res_sign;
8879 int rscale,
bool round,
bool exact)
8881 int var1ndigits = var1->
ndigits;
8882 int var2ndigits = var2->
ndigits;
8886 int var1ndigitpairs;
8887 int var2ndigitpairs;
8888 int res_ndigitpairs;
8889 int div_ndigitpairs;
8909 if (var2ndigits == 0 || var2->
digits[0] == 0)
8911 (
errcode(ERRCODE_DIVISION_BY_ZERO),
8912 errmsg(
"division by zero")));
8921 if (var2ndigits <= 2)
8924 int idivisor_weight;
8926 idivisor = var2->
digits[0];
8927 idivisor_weight = var2->
weight;
8928 if (var2ndigits == 2)
8934 idivisor = -idivisor;
8936 div_var_int(var1, idivisor, idivisor_weight, result, rscale, round);
8940 if (var2ndigits <= 4)
8943 int idivisor_weight;
8945 idivisor = var2->
digits[0];
8946 idivisor_weight = var2->
weight;
8947 for (
i = 1;
i < var2ndigits;
i++)
8953 idivisor = -idivisor;
8955 div_var_int64(var1, idivisor, idivisor_weight, result, rscale, round);
8965 if (var1ndigits == 0)
9001 res_ndigits =
Max(res_ndigits, 1);
9016 var1ndigitpairs = (var1ndigits + 1) / 2;
9017 var2ndigitpairs = (var2ndigits + 1) / 2;
9018 res_ndigitpairs = (res_ndigits + 1) / 2;
9019 res_ndigits = 2 * res_ndigitpairs;
9036 div_ndigitpairs = res_ndigitpairs + var2ndigitpairs;
9037 var1ndigitpairs =
Min(var1ndigitpairs, div_ndigitpairs);
9041 div_ndigitpairs = res_ndigitpairs;
9042 var1ndigitpairs =
Min(var1ndigitpairs, div_ndigitpairs);
9043 var2ndigitpairs =
Min(var2ndigitpairs, div_ndigitpairs);
9055 var2ndigitpairs *
sizeof(
int32));
9056 divisor = (
int32 *) (dividend + div_ndigitpairs + 1);
9059 for (
i = 0;
i < var1ndigitpairs - 1;
i++)
9062 if (2 *
i + 1 < var1ndigits)
9067 memset(dividend +
i + 1, 0, (div_ndigitpairs -
i) *
sizeof(
int64));
9070 for (
i = 0;
i < var2ndigitpairs - 1;
i++)
9073 if (2 *
i + 1 < var2ndigits)
9091 fdivisor = (double) divisor[0] *
NBASE_SQR;
9092 if (var2ndigitpairs > 1)
9093 fdivisor += (double) divisor[1];
9094 fdivisorinverse = 1.0 / fdivisor;
9121 for (qi = 0; qi < res_ndigitpairs; qi++)
9124 fdividend = (double) dividend[qi] *
NBASE_SQR;
9125 fdividend += (double) dividend[qi + 1];
9128 fquotient = fdividend * fdivisorinverse;
9129 qdigit = (fquotient >= 0.0) ? ((
int32) fquotient) :
9130 (((
int32) fquotient) - 1);
9135 maxdiv += i64abs(qdigit);
9146 for (
i =
Min(qi + var2ndigitpairs - 2, div_ndigitpairs - 1);
i > qi;
i--)
9148 newdig = dividend[
i] + carry;
9151 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9161 dividend[
i] = newdig;
9163 dividend[qi] += carry;
9177 fdividend = (double) dividend[qi] *
NBASE_SQR;
9178 fdividend += (double) dividend[qi + 1];
9179 fquotient = fdividend * fdivisorinverse;
9180 qdigit = (fquotient >= 0.0) ? ((
int32) fquotient) :
9181 (((
int32) fquotient) - 1);
9183 maxdiv += i64abs(qdigit);
9203 int istop =
Min(var2ndigitpairs, div_ndigitpairs - qi);
9204 int64 *dividend_qi = ÷nd[qi];
9206 for (
i = 0;
i < istop;
i++)
9207 dividend_qi[
i] -= (
int64) qdigit * divisor[
i];
9236 dividend[qi + 1] += dividend[qi] *
NBASE_SQR;
9238 dividend[qi] = qdigit;
9258 for (
i = var2ndigitpairs - 2;
i >= 0;
i--)
9263 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9291 for (
i = var2ndigitpairs - 1;
i > 0;
i--)
9325 for (
i = 0;
i < var2ndigitpairs;
i++)
9340 for (
i = var2ndigitpairs - 1;
i > 0;
i--)
9371 res_digits = result->
digits;
9373 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
9375 newdig = dividend[
i] + carry;
9378 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9398 result->
weight = res_weight;
9399 result->
sign = res_sign;
9423 int var_ndigits = var->
ndigits;
9435 errcode(ERRCODE_DIVISION_BY_ZERO),
9436 errmsg(
"division by zero"));
9439 if (var_ndigits == 0)
9455 res_weight = var->
weight - ival_weight;
9459 res_ndigits =
Max(res_ndigits, 1);
9466 res_digits = res_buf + 1;
9478 divisor = abs(ival);
9480 if (divisor <= UINT_MAX /
NBASE)
9485 for (
i = 0;
i < res_ndigits;
i++)
9487 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9489 carry = carry % divisor;
9497 for (
i = 0;
i < res_ndigits;
i++)
9499 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9501 carry = carry % divisor;
9507 result->
ndigits = res_ndigits;
9508 result->
buf = res_buf;
9509 result->
digits = res_digits;
9510 result->
weight = res_weight;
9511 result->
sign = res_sign;
9539 int var_ndigits = var->
ndigits;
9551 errcode(ERRCODE_DIVISION_BY_ZERO),
9552 errmsg(
"division by zero"));
9555 if (var_ndigits == 0)
9571 res_weight = var->
weight - ival_weight;
9575 res_ndigits =
Max(res_ndigits, 1);
9582 res_digits = res_buf + 1;
9594 divisor = i64abs(ival);
9601 for (
i = 0;
i < res_ndigits;
i++)
9603 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9605 carry = carry % divisor;
9613 for (
i = 0;
i < res_ndigits;
i++)
9615 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9617 carry = carry % divisor;
9623 result->
ndigits = res_ndigits;
9624 result->
buf = res_buf;
9625 result->
digits = res_digits;
9626 result->
weight = res_weight;
9627 result->
sign = res_sign;
9671 firstdigit1 = var1->
digits[
i];
9672 if (firstdigit1 != 0)
9683 firstdigit2 = var2->
digits[
i];
9684 if (firstdigit2 != 0)
9695 qweight = weight1 - weight2;
9696 if (firstdigit1 <= firstdigit2)
9728 div_var(var1, var2, &tmp, 0,
false,
true);
9759 div_var(var1, var2, &q, 0,
false,
false);
9785 while (
cmp_abs(&r, var2) >= 0)
9894 result->
dscale = res_dscale;
9910 mod_var(&tmp_arg, result, &mod);
9917 result->
dscale = res_dscale;
9966 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
9967 errmsg(
"cannot take square root of a negative number")));
9980 if (
arg->weight >= 0)
9981 res_weight =
arg->weight / 2;
9983 res_weight = -((-
arg->weight - 1) / 2 + 1);
9991 if (rscale + 1 >= 0)
9994 res_ndigits = res_weight + 1 - (-rscale - 1) /
DEC_DIGITS;
9995 res_ndigits =
Max(res_ndigits, 1);
10003 src_ndigits =
arg->weight + 1 + (res_ndigits - res_weight - 1) * 2;
10004 src_ndigits =
Max(src_ndigits, 1);
10074 while ((ndigits[step] = src_ndigits) > 4)
10077 blen = src_ndigits / 4;
10078 if (blen * 4 == src_ndigits &&
arg->digits[0] <
NBASE / 4)
10082 src_ndigits -= 2 * blen;
10094 arg_int64 =
arg->digits[0];
10095 for (src_idx = 1; src_idx < src_ndigits; src_idx++)
10097 arg_int64 *=
NBASE;
10098 if (src_idx < arg->ndigits)
10099 arg_int64 +=
arg->digits[src_idx];
10102 s_int64 = (
int64) sqrt((
double) arg_int64);
10103 r_int64 = arg_int64 - s_int64 * s_int64;
10115 while (r_int64 < 0 || r_int64 > 2 * s_int64)
10117 s_int64 = (s_int64 + arg_int64 / s_int64) / 2;
10118 r_int64 = arg_int64 - s_int64 * s_int64;
10141 while (step >= 0 && (src_ndigits = ndigits[step]) <= 8)
10152 blen = (src_ndigits - src_idx) / 2;
10159 for (
i = 0;
i < blen;
i++, src_idx++)
10163 if (src_idx < arg->ndigits)
10164 a1 +=
arg->digits[src_idx];
10167 for (
i = 0;
i < blen;
i++, src_idx++)
10170 if (src_idx < arg->ndigits)
10171 a0 +=
arg->digits[src_idx];
10175 numer = r_int64 *
b +
a1;
10176 denom = 2 * s_int64;
10178 u = numer - q * denom;
10181 s_int64 = s_int64 *
b + q;
10182 r_int64 = u *
b + a0 - q * q;
10187 r_int64 += s_int64;
10189 r_int64 += s_int64;
10192 Assert(src_idx == src_ndigits);
10206 s_int128 = s_int64;
10207 r_int128 = r_int64;
10215 while (step >= 0 && (src_ndigits = ndigits[step]) <= 16)
10226 blen = (src_ndigits - src_idx) / 2;
10233 for (
i = 0;
i < blen;
i++, src_idx++)
10237 if (src_idx < arg->ndigits)
10238 a1 +=
arg->digits[src_idx];
10241 for (
i = 0;
i < blen;
i++, src_idx++)
10244 if (src_idx < arg->ndigits)
10245 a0 +=
arg->digits[src_idx];
10249 numer = r_int128 *
b +
a1;
10250 denom = 2 * s_int128;
10252 u = numer - q * denom;
10255 s_int128 = s_int128 *
b + q;
10256 r_int128 = u *
b + a0 - q * q;
10261 r_int128 += s_int128;
10263 r_int128 += s_int128;
10266 Assert(src_idx == src_ndigits);
10299 src_ndigits = ndigits[step];
10300 blen = (src_ndigits - src_idx) / 2;
10303 if (src_idx < arg->ndigits)
10305 tmp_len =
Min(blen,
arg->ndigits - src_idx);
10307 memcpy(a1_var.
digits,
arg->digits + src_idx,
10309 a1_var.
weight = blen - 1;
10321 if (src_idx < arg->ndigits)
10323 tmp_len =
Min(blen,
arg->ndigits - src_idx);
10325 memcpy(a0_var.
digits,
arg->digits + src_idx,
10327 a0_var.
weight = blen - 1;
10342 add_var(&q_var, &a1_var, &q_var);
10343 add_var(&s_var, &s_var, &u_var);
10348 add_var(&s_var, &q_var, &s_var);
10358 add_var(&u_var, &a0_var, &u_var);
10359 mul_var(&q_var, &q_var, &q_var, 0);
10364 sub_var(&u_var, &q_var, &r_var);
10368 add_var(&r_var, &s_var, &r_var);
10370 add_var(&r_var, &s_var, &r_var);
10376 if (
cmp_var(&u_var, &q_var) < 0)
10380 Assert(src_idx == src_ndigits);
10388 result->
weight = res_weight;
10440 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
10441 errmsg(
"value overflows numeric format")));
10443 result->
dscale = rscale;
10448 dweight = (int) (
val * 0.434294481903252);
10457 if (fabs(
val) > 0.01)
10462 while (fabs(
val) > 0.01)
10468 local_rscale =
x.dscale + ndiv2;
10481 sig_digits = 1 + dweight + rscale + (int) (ndiv2 * 0.301029995663981);
10482 sig_digits =
Max(sig_digits, 0) + 8;
10484 local_rscale = sig_digits - 1;
10498 div_var_int(&elem, ni, 0, &elem, local_rscale,
true);
10502 add_var(result, &elem, result);
10504 mul_var(&elem, &
x, &elem, local_rscale);
10506 div_var_int(&elem, ni, 0, &elem, local_rscale,
true);
10514 while (ndiv2-- > 0)
10518 mul_var(result, result, result, local_rscale);
10566 ln_dweight =
x.weight *
DEC_DIGITS + (int) log10(
x.digits[0]);
10603 ln_var = log((
double)
digits) + dweight * 2.302585092994046;
10604 ln_dweight = (int) log10(fabs(
ln_var));
10637 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
10638 errmsg(
"cannot take logarithm of zero")));
10641 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
10642 errmsg(
"cannot take logarithm of a negative number")));
10670 local_rscale = rscale -
x.weight *
DEC_DIGITS / 2 + 8;
10677 local_rscale = rscale -
x.weight *
DEC_DIGITS / 2 + 8;
10698 local_rscale = rscale + (int) ((nsqrt + 1) * 0.301029995663981) + 8;
10702 div_var(result, &elem, result, local_rscale,
true,
false);
10704 mul_var(result, result, &
x, local_rscale);
10711 mul_var(&xx, &
x, &xx, local_rscale);
10712 div_var_int(&xx, ni, 0, &elem, local_rscale,
true);
10717 add_var(result, &elem, result);
10724 mul_var(result, &fact, result, rscale);
10745 int ln_base_dweight;
10746 int ln_num_dweight;
10747 int result_dweight;
10749 int ln_base_rscale;
10758 result_dweight = ln_num_dweight - ln_base_dweight;
10775 ln_base_rscale = rscale + result_dweight - ln_base_dweight + 8;
10778 ln_num_rscale = rscale + result_dweight - ln_num_dweight + 8;
10782 ln_var(base, &ln_base, ln_base_rscale);
10783 ln_var(num, &ln_num, ln_num_rscale);
10786 div_var(&ln_num, &ln_base, result, rscale,
true,
false);
10857 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
10858 errmsg(
"a negative number raised to a non-integer power yields a complex result")));
10901 local_rscale = 8 - ln_dweight;
10904 ln_var(base, &ln_base, local_rscale);
10906 mul_var(&ln_base, exp, &ln_num, local_rscale);
10915 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
10916 errmsg(
"value overflows numeric format")));
10922 val *= 0.434294481903252;
10932 sig_digits = rscale + (int)
val;
10933 sig_digits =
Max(sig_digits, 0);
10936 local_rscale = sig_digits - ln_dweight + 8;
10941 ln_var(base, &ln_base, local_rscale);
10943 mul_var(&ln_base, exp, &ln_num, local_rscale);
10945 exp_var(&ln_num, result, rscale);
11001 f = exp * (log10(f) + p);
11009 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
11010 errmsg(
"value overflows numeric format")));
11025 rscale =
Max(rscale, exp_dscale);
11041 result->
dscale = rscale;
11051 mul_var(base, base, result, rscale);
11062 (
errcode(ERRCODE_DIVISION_BY_ZERO),
11063 errmsg(
"division by zero")));
11065 result->
dscale = rscale;
11083 sig_digits = 1 + rscale + (int) f;
11090 sig_digits += (int) log(fabs((
double) exp)) + 8;
11106 while ((mask >>= 1) > 0)
11114 local_rscale =
Min(local_rscale, 2 * base_prod.
dscale);
11117 mul_var(&base_prod, &base_prod, &base_prod, local_rscale);
11121 local_rscale = sig_digits -
11123 local_rscale =
Min(local_rscale,
11127 mul_var(&base_prod, result, result, local_rscale);
11144 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
11145 errmsg(
"value overflows numeric format")));
11174 result->
dscale = exp < 0 ? -exp : 0;
11186 result->
digits[0] *= 10;
11203 int rlen64_ndigits;
11213 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
11214 errmsg(
"lower bound must be less than or equal to upper bound"));
11220 result->
dscale = rscale;
11239 for (
i = 0;
i < n;
i++)
11266 rlen64_ndigits = 1;
11267 while (rlen64_ndigits < res_ndigits && rlen64_ndigits < 4)
11270 if (rlen64_ndigits < rlen.
ndigits)
11271 rlen64 += rlen.
digits[rlen64_ndigits];
11285 result->
dscale = rscale;
11286 res_digits = result->
digits;
11295 if (rlen64_ndigits == res_ndigits && pow10 != 1)
11300 for (
i = rlen64_ndigits - 1;
i >= 0;
i--)
11303 rand = rand /
NBASE;
11310 whole_ndigits = res_ndigits;
11315 i = rlen64_ndigits;
11316 while (
i < whole_ndigits - 3)
11321 rand = rand /
NBASE;
11323 rand = rand /
NBASE;
11325 rand = rand /
NBASE;
11330 while (
i < whole_ndigits)
11337 if (
i < res_ndigits)
11348 }
while (
cmp_var(result, &rlen) > 0);
11351 add_var(result, rmin, result);
11391 const NumericDigit *var2digits,
int var2ndigits,
int var2weight)
11398 while (var1weight > var2weight && i1 < var1ndigits)
11400 if (var1digits[i1++] != 0)
11404 while (var2weight > var1weight && i2 < var2ndigits)
11406 if (var2digits[i2++] != 0)
11413 if (var1weight == var2weight)
11415 while (i1 < var1ndigits && i2 < var2ndigits)
11417 int stat = var1digits[i1++] - var2digits[i2++];
11432 while (i1 < var1ndigits)
11434 if (var1digits[i1++] != 0)
11437 while (i2 < var2ndigits)
11439 if (var2digits[i2++] != 0)
11470 int var1ndigits = var1->
ndigits;
11471 int var2ndigits = var2->
ndigits;
11482 res_rscale =
Max(rscale1, rscale2);
11484 res_ndigits = res_rscale + res_weight + 1;
11485 if (res_ndigits <= 0)
11490 res_digits = res_buf + 1;
11492 i1 = res_rscale + var1->
weight + 1;
11493 i2 = res_rscale + var2->
weight + 1;
11494 for (
i = res_ndigits - 1;
i >= 0;
i--)
11498 if (i1 >= 0 && i1 < var1ndigits)
11499 carry += var1digits[i1];
11500 if (i2 >= 0 && i2 < var2ndigits)
11501 carry += var2digits[i2];
11503 if (carry >=
NBASE)
11505 res_digits[
i] = carry -
NBASE;
11510 res_digits[
i] = carry;
11518 result->
ndigits = res_ndigits;
11519 result->
buf = res_buf;
11520 result->
digits = res_digits;
11521 result->
weight = res_weight;
11522 result->
dscale = res_dscale;
11555 int var1ndigits = var1->
ndigits;
11556 int var2ndigits = var2->
ndigits;
11560 res_weight = var1->
weight;
11567 res_rscale =
Max(rscale1, rscale2);
11569 res_ndigits = res_rscale + res_weight + 1;
11570 if (res_ndigits <= 0)
11575 res_digits = res_buf + 1;
11577 i1 = res_rscale + var1->
weight + 1;
11578 i2 = res_rscale + var2->
weight + 1;
11579 for (
i = res_ndigits - 1;
i >= 0;
i--)
11583 if (i1 >= 0 && i1 < var1ndigits)
11584 borrow += var1digits[i1];
11585 if (i2 >= 0 && i2 < var2ndigits)
11586 borrow -= var2digits[i2];
11590 res_digits[
i] = borrow +
NBASE;
11595 res_digits[
i] = borrow;
11603 result->
ndigits = res_ndigits;
11604 result->
buf = res_buf;
11605 result->
digits = res_digits;
11606 result->
weight = res_weight;
11607 result->
dscale = res_dscale;
11651 if (ndigits < var->ndigits ||
11652 (ndigits == var->
ndigits && di > 0))
11670#elif DEC_DIGITS == 2
11673#error unsupported NBASE
11675 extra =
digits[--ndigits] % pow10;
11676 digits[ndigits] -= extra;
11678 if (extra >= pow10 / 2)
11680 pow10 +=
digits[ndigits];
11681 if (pow10 >=
NBASE)
11686 digits[ndigits] = pow10;
11694 carry +=
digits[--ndigits];
11695 if (carry >=
NBASE)
11702 digits[ndigits] = carry;
11751 if (ndigits <= var->ndigits)
11770#elif DEC_DIGITS == 2
11773#error unsupported NBASE
11775 extra =
digits[--ndigits] % pow10;
11776 digits[ndigits] -= extra;
11795 while (ndigits > 0 && *
digits == 0)
11803 while (ndigits > 0 &&
digits[ndigits - 1] == 0)
11848 int32 *accum_digits;
11877 val_ndigits =
val->ndigits;
11878 val_digits =
val->digits;
11881 for (val_i = 0; val_i < val_ndigits; val_i++)
11883 accum_digits[
i] += (
int32) val_digits[val_i];
11923 for (
i = ndigits - 1;
i >= 0;
i--)
11925 newdig = dig[
i] + carry;
11926 if (newdig >=
NBASE)
11928 carry = newdig /
NBASE;
11929 newdig -= carry *
NBASE;
11942 for (
i = ndigits - 1;
i >= 0;
i--)
11944 newdig = dig[
i] + carry;
11945 if (newdig >=
NBASE)
11947 carry = newdig /
NBASE;
11948 newdig -= carry *
NBASE;
11969 int old_weight = accum->
weight;
11970 int old_ndigits = accum->
ndigits;
11976 accum_weight = old_weight;
11977 accum_ndigits = old_ndigits;
11988 if (
val->weight >= accum_weight)
11990 accum_weight =
val->weight + 1;
11991 accum_ndigits = accum_ndigits + (accum_weight - old_weight);
12006 accum_rscale = accum_ndigits - accum_weight - 1;
12007 val_rscale =
val->ndigits -
val->weight - 1;
12008 if (val_rscale > accum_rscale)
12009 accum_ndigits = accum_ndigits + (val_rscale - accum_rscale);
12011 if (accum_ndigits != old_ndigits ||
12012 accum_weight != old_weight)
12014 int32 *new_pos_digits;
12015 int32 *new_neg_digits;
12018 weightdiff = accum_weight - old_weight;
12020 new_pos_digits =
palloc0(accum_ndigits *
sizeof(
int32));
12021 new_neg_digits =
palloc0(accum_ndigits *
sizeof(
int32));
12025 memcpy(&new_pos_digits[weightdiff], accum->
pos_digits,
12026 old_ndigits *
sizeof(
int32));
12029 memcpy(&new_neg_digits[weightdiff], accum->
neg_digits,
12030 old_ndigits *
sizeof(
int32));
12037 accum->
weight = accum_weight;
12038 accum->
ndigits = accum_ndigits;
12094 add_var(&pos_var, &neg_var, result);
#define PG_GETARG_ARRAYTYPE_P_COPY(n)
#define PG_GETARG_ARRAYTYPE_P(n)
#define PG_RETURN_ARRAYTYPE_P(x)
#define ARR_OVERHEAD_NONULLS(ndims)
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
Datum numeric_stddev_samp(PG_FUNCTION_ARGS)
static const NumericVar const_two
static void mod_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static const NumericVar const_pinf
static char * get_str_from_var_sci(const NumericVar *var, int rscale)
#define NUMERIC_INF_SIGN_MASK
#define dump_numeric(s, n)
#define NUMERIC_CAN_BE_SHORT(scale, weight)
static void ceil_var(const NumericVar *var, NumericVar *result)
static void accum_sum_carry(NumericSumAccum *accum)
#define DatumGetNumericAbbrev(X)
#define NUMERIC_HDRSZ_SHORT
#define digitbuf_free(buf)
Datum numeric_poly_var_samp(PG_FUNCTION_ARGS)
static const NumericDigit const_zero_point_nine_data[1]
char * numeric_normalize(Numeric num)
Datum numeric_accum(PG_FUNCTION_ARGS)
static void exp_var(const NumericVar *arg, NumericVar *result, int rscale)
Datum numeric_poly_serialize(PG_FUNCTION_ARGS)
Datum int2_accum_inv(PG_FUNCTION_ARGS)
static Datum numeric_abbrev_convert_var(const NumericVar *var, NumericSortSupport *nss)
Datum numeric_accum_inv(PG_FUNCTION_ARGS)
#define PRODSUM2(v1, i1, v2, i2)
char * numeric_out_sci(Numeric num, int scale)
Datum numeric_div(PG_FUNCTION_ARGS)
Datum numeric_sub(PG_FUNCTION_ARGS)
int32 numeric_maximum_size(int32 typmod)
static bool numeric_abbrev_abort(int memtupcount, SortSupport ssup)
Datum numeric_poly_var_pop(PG_FUNCTION_ARGS)
Datum numeric_avg_serialize(PG_FUNCTION_ARGS)
Datum hash_numeric(PG_FUNCTION_ARGS)
static Numeric make_result_safe(const NumericVar *var, Node *escontext)
Datum hash_numeric_extended(PG_FUNCTION_ARGS)
static bool numeric_is_integral(Numeric num)
static Int128AggState * makeInt128AggState(FunctionCallInfo fcinfo, bool calcSumX2)
Datum numeric_var_pop(PG_FUNCTION_ARGS)
static int get_min_scale(NumericVar *var)
static void sub_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static void power_var(const NumericVar *base, const NumericVar *exp, NumericVar *result)
static bool is_valid_numeric_typmod(int32 typmod)
static void div_var_int(const NumericVar *var, int ival, int ival_weight, NumericVar *result, int rscale, bool round)
static int cmp_numerics(Numeric num1, Numeric num2)
static NumericAggState * makeNumericAggState(FunctionCallInfo fcinfo, bool calcSumX2)
Datum numeric_avg(PG_FUNCTION_ARGS)
static void numericvar_serialize(StringInfo buf, const NumericVar *var)
static void accum_sum_final(NumericSumAccum *accum, NumericVar *result)
static void power_var_int(const NumericVar *base, int exp, int exp_dscale, NumericVar *result)
static void free_var(NumericVar *var)
#define NUMERIC_DSCALE(n)
Datum int2_sum(PG_FUNCTION_ARGS)
static int numeric_typmod_scale(int32 typmod)
Datum numeric_poly_sum(PG_FUNCTION_ARGS)
Datum int2_accum(PG_FUNCTION_ARGS)
Datum float8_numeric(PG_FUNCTION_ARGS)
#define PRODSUM3(v1, i1, v2, i2)
static void trunc_var(NumericVar *var, int rscale)
Datum numeric_round(PG_FUNCTION_ARGS)
static void set_var_from_num(Numeric num, NumericVar *dest)
static void accum_sum_add(NumericSumAccum *accum, const NumericVar *val)
Datum numeric_cmp(PG_FUNCTION_ARGS)
Datum int4_avg_combine(PG_FUNCTION_ARGS)
Datum width_bucket_numeric(PG_FUNCTION_ARGS)
Datum int8_sum(PG_FUNCTION_ARGS)
Datum int8_accum_inv(PG_FUNCTION_ARGS)
#define PRODSUM1(v1, i1, v2, i2)
Datum numerictypmodout(PG_FUNCTION_ARGS)
Datum generate_series_numeric_support(PG_FUNCTION_ARGS)
static Numeric duplicate_numeric(Numeric num)
static int32 make_numeric_typmod(int precision, int scale)
Datum numeric_recv(PG_FUNCTION_ARGS)
static void sub_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
Numeric int64_to_numeric(int64 val)
Datum numeric_trim_scale(PG_FUNCTION_ARGS)
Datum int2int4_sum(PG_FUNCTION_ARGS)
static Numeric numeric_stddev_internal(NumericAggState *state, bool variance, bool sample, bool *is_null)
Numeric random_numeric(pg_prng_state *state, Numeric rmin, Numeric rmax)
Datum float4_numeric(PG_FUNCTION_ARGS)
Datum numeric_poly_stddev_samp(PG_FUNCTION_ARGS)
static void add_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
Datum generate_series_step_numeric(PG_FUNCTION_ARGS)
Datum numeric_int8(PG_FUNCTION_ARGS)
static void do_numeric_accum(NumericAggState *state, Numeric newval)
Datum int4_numeric(PG_FUNCTION_ARGS)
Datum numeric_sum(PG_FUNCTION_ARGS)
Datum numeric_ge(PG_FUNCTION_ARGS)
static const NumericVar const_ninf
Datum numeric_uplus(PG_FUNCTION_ARGS)
Datum numeric_stddev_pop(PG_FUNCTION_ARGS)
Datum numeric_uminus(PG_FUNCTION_ARGS)
static void add_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static Datum numeric_abbrev_convert(Datum original_datum, SortSupport ssup)
static INT128 int128_deserialize(StringInfo buf)
Numeric numeric_mod_safe(Numeric num1, Numeric num2, Node *escontext)
#define NUMERIC_IS_SPECIAL(n)
#define NA_TOTAL_COUNT(na)
Datum numeric_le(PG_FUNCTION_ARGS)
Datum numeric_ceil(PG_FUNCTION_ARGS)
Datum numeric_send(PG_FUNCTION_ARGS)
struct Int8TransTypeData Int8TransTypeData
static void gcd_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static bool set_var_from_non_decimal_integer_str(const char *str, const char *cp, int sign, int base, NumericVar *dest, const char **endptr, Node *escontext)
int32 numeric_int4_safe(Numeric num, Node *escontext)
Datum numerictypmodin(PG_FUNCTION_ARGS)
Datum in_range_numeric_numeric(PG_FUNCTION_ARGS)
static void do_int128_discard(Int128AggState *state, int64 newval)
static Numeric numeric_poly_stddev_internal(Int128AggState *state, bool variance, bool sample, bool *is_null)
Datum numeric_power(PG_FUNCTION_ARGS)
Numeric numeric_add_safe(Numeric num1, Numeric num2, Node *escontext)
Numeric int64_div_fast_to_numeric(int64 val1, int log10val2)
#define PRODSUM5(v1, i1, v2, i2)
static const NumericVar const_minus_one
static bool numericvar_to_int32(const NumericVar *var, int32 *result)
int64 numeric_int8_safe(Numeric num, Node *escontext)
static int numeric_fast_cmp(Datum x, Datum y, SortSupport ssup)
static void floor_var(const NumericVar *var, NumericVar *result)
Datum numeric_int4(PG_FUNCTION_ARGS)
Datum numeric_gcd(PG_FUNCTION_ARGS)
static const NumericDigit const_one_data[1]
Datum numeric_poly_combine(PG_FUNCTION_ARGS)
static void init_var_from_num(Numeric num, NumericVar *dest)
static const NumericDigit const_two_data[1]
Numeric numeric_div_safe(Numeric num1, Numeric num2, Node *escontext)
Datum numeric_fac(PG_FUNCTION_ARGS)
Datum numeric_serialize(PG_FUNCTION_ARGS)
#define NUMERIC_SHORT_WEIGHT_MASK
#define NUMERIC_IS_PINF(n)
static void zero_var(NumericVar *var)
Datum numeric_ne(PG_FUNCTION_ARGS)
#define NUMERIC_SHORT_WEIGHT_SIGN_MASK
Datum numeric(PG_FUNCTION_ARGS)
Datum int4_avg_accum_inv(PG_FUNCTION_ARGS)
static bool do_numeric_discard(NumericAggState *state, Numeric newval)
#define PRODSUM6(v1, i1, v2, i2)
Datum int8_avg_serialize(PG_FUNCTION_ARGS)
Datum numeric_exp(PG_FUNCTION_ARGS)
static int numeric_cmp_abbrev(Datum x, Datum y, SortSupport ssup)
Datum numeric_log(PG_FUNCTION_ARGS)
static void mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, int rscale)
Datum numeric_scale(PG_FUNCTION_ARGS)
Datum numeric_sqrt(PG_FUNCTION_ARGS)
static bool apply_typmod_special(Numeric num, int32 typmod, Node *escontext)
Datum int4_accum_inv(PG_FUNCTION_ARGS)
Datum numeric_poly_deserialize(PG_FUNCTION_ARGS)
#define NUMERIC_IS_INF(n)
Datum numeric_inc(PG_FUNCTION_ARGS)
static void random_var(pg_prng_state *state, const NumericVar *rmin, const NumericVar *rmax, NumericVar *result)
static char * get_str_from_var(const NumericVar *var)
Numeric numeric_sub_safe(Numeric num1, Numeric num2, Node *escontext)
Datum int8_avg_accum_inv(PG_FUNCTION_ARGS)
Datum int4_accum(PG_FUNCTION_ARGS)
Datum generate_series_numeric(PG_FUNCTION_ARGS)
#define NUMERIC_ABBREV_PINF
static void compute_bucket(Numeric operand, Numeric bound1, Numeric bound2, const NumericVar *count_var, NumericVar *result_var)
Datum numeric_out(PG_FUNCTION_ARGS)
Datum numeric_int2(PG_FUNCTION_ARGS)
#define digitbuf_alloc(ndigits)
struct NumericAggState NumericAggState
static void sqrt_var(const NumericVar *arg, NumericVar *result, int rscale)
Datum numeric_trunc(PG_FUNCTION_ARGS)
static bool set_var_from_str(const char *str, const char *cp, NumericVar *dest, const char **endptr, Node *escontext)
static int estimate_ln_dweight(const NumericVar *var)
Datum numeric_lcm(PG_FUNCTION_ARGS)
static int cmp_var(const NumericVar *var1, const NumericVar *var2)
Datum numeric_div_trunc(PG_FUNCTION_ARGS)
static int numeric_sign_internal(Numeric num)
Datum int8_accum(PG_FUNCTION_ARGS)
static NumericAggState * makeNumericAggStateCurrentContext(bool calcSumX2)
static int select_div_scale(const NumericVar *var1, const NumericVar *var2)
Datum numeric_avg_deserialize(PG_FUNCTION_ARGS)
static void mul_var_short(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
#define NUMERIC_ABBREV_NAN
static int cmp_abs_common(const NumericDigit *var1digits, int var1ndigits, int var1weight, const NumericDigit *var2digits, int var2ndigits, int var2weight)
Datum numeric_poly_stddev_pop(PG_FUNCTION_ARGS)
static bool apply_typmod(NumericVar *var, int32 typmod, Node *escontext)
#define NUMERIC_IS_NINF(n)
Datum numeric_float8(PG_FUNCTION_ARGS)
Datum int2_avg_accum_inv(PG_FUNCTION_ARGS)
static const NumericVar const_zero_point_nine
static int cmp_abs(const NumericVar *var1, const NumericVar *var2)
static const NumericVar const_zero
Datum numeric_in(PG_FUNCTION_ARGS)
#define NUMERIC_ABBREV_NINF
static void accum_sum_combine(NumericSumAccum *accum, NumericSumAccum *accum2)
static void numericvar_deserialize(StringInfo buf, NumericVar *var)
static const int round_powers[4]
Datum numeric_mod(PG_FUNCTION_ARGS)
struct NumericSumAccum NumericSumAccum
bool numeric_is_nan(Numeric num)
#define NUMERIC_SIGN_MASK
static void int128_serialize(StringInfo buf, INT128 val)
Datum numeric_lt(PG_FUNCTION_ARGS)
#define NUMERIC_DSCALE_MASK
Datum numeric_var_samp(PG_FUNCTION_ARGS)
Datum numeric_sortsupport(PG_FUNCTION_ARGS)
struct NumericVar NumericVar
static void int64_to_numericvar(int64 val, NumericVar *var)
Datum int8_avg_deserialize(PG_FUNCTION_ARGS)
static void do_int128_accum(Int128AggState *state, int64 newval)
static bool numericvar_to_int64(const NumericVar *var, int64 *result)
Datum numeric_float8_no_overflow(PG_FUNCTION_ARGS)
Datum numeric_combine(PG_FUNCTION_ARGS)
Datum int8_avg_combine(PG_FUNCTION_ARGS)
Datum int8_avg_accum(PG_FUNCTION_ARGS)
#define PRODSUM4(v1, i1, v2, i2)
Datum numeric_sign(PG_FUNCTION_ARGS)
Datum int2_numeric(PG_FUNCTION_ARGS)
static int numeric_typmod_precision(int32 typmod)
#define NUMERIC_DSCALE_MAX
Datum int4_sum(PG_FUNCTION_ARGS)
static void alloc_var(NumericVar *var, int ndigits)
static int xdigit_value(char dig)
static Numeric make_result(const NumericVar *var)
static const NumericDigit const_one_point_one_data[2]
#define NumericAbbrevGetDatum(X)
#define NUMERIC_SHORT_DSCALE_SHIFT
static void accum_sum_reset(NumericSumAccum *accum)
#define NUMERIC_WEIGHT(n)
Datum numeric_add(PG_FUNCTION_ARGS)
static void round_var(NumericVar *var, int rscale)
Numeric numeric_mul_safe(Numeric num1, Numeric num2, Node *escontext)
Datum numeric_poly_avg(PG_FUNCTION_ARGS)
Datum numeric_eq(PG_FUNCTION_ARGS)
static void div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, int rscale, bool round, bool exact)
static void set_var_from_var(const NumericVar *value, NumericVar *dest)
static void log_var(const NumericVar *base, const NumericVar *num, NumericVar *result)
Datum numeric_ln(PG_FUNCTION_ARGS)
#define NUMERIC_SHORT_SIGN_MASK
static bool numericvar_to_uint64(const NumericVar *var, uint64 *result)
Datum numeric_abs(PG_FUNCTION_ARGS)
Datum int8_avg(PG_FUNCTION_ARGS)
Datum numeric_avg_accum(PG_FUNCTION_ARGS)
static Int128AggState * makeInt128AggStateCurrentContext(bool calcSumX2)
Datum numeric_larger(PG_FUNCTION_ARGS)
static const NumericVar const_one_point_one
Datum int4_avg_accum(PG_FUNCTION_ARGS)
static void strip_var(NumericVar *var)
static const NumericVar const_nan
#define NUMERIC_IS_SHORT(n)
static void int128_to_numericvar(INT128 val, NumericVar *var)
Datum numeric_smaller(PG_FUNCTION_ARGS)
Datum numeric_gt(PG_FUNCTION_ARGS)
Datum numeric_deserialize(PG_FUNCTION_ARGS)
#define NUMERIC_DIGITS(num)
Datum int8_numeric(PG_FUNCTION_ARGS)
Datum numeric_mul(PG_FUNCTION_ARGS)
#define NUMERIC_IS_NAN(n)
static const NumericDigit const_zero_data[1]
static double numericvar_to_double_no_overflow(const NumericVar *var)
Datum numeric_avg_combine(PG_FUNCTION_ARGS)
Datum numeric_min_scale(PG_FUNCTION_ARGS)
#define NUMERIC_WEIGHT_MAX
Datum numeric_float4(PG_FUNCTION_ARGS)
Datum numeric_support(PG_FUNCTION_ARGS)
static const NumericVar const_one
#define NUMERIC_NDIGITS(num)
static void accum_sum_rescale(NumericSumAccum *accum, const NumericVar *val)
static int cmp_var_common(const NumericDigit *var1digits, int var1ndigits, int var1weight, int var1sign, const NumericDigit *var2digits, int var2ndigits, int var2weight, int var2sign)
bool numeric_is_inf(Numeric num)
static void ln_var(const NumericVar *arg, NumericVar *result, int rscale)
Datum numeric_pg_lsn(PG_FUNCTION_ARGS)
struct Int128AggState Int128AggState
static void power_ten_int(int exp, NumericVar *result)
static void accum_sum_copy(NumericSumAccum *dst, NumericSumAccum *src)
Datum numeric_floor(PG_FUNCTION_ARGS)
Datum int2_avg_accum(PG_FUNCTION_ARGS)
static void div_mod_var(const NumericVar *var1, const NumericVar *var2, NumericVar *quot, NumericVar *rem)
#define FLEXIBLE_ARRAY_MEMBER
#define StaticAssertDecl(condition, errmessage)
Node * estimate_expression_value(PlannerInfo *root, Node *node)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereturn(context, dummy_value,...)
#define ereport(elevel,...)
Datum float8in(PG_FUNCTION_ARGS)
Datum float4in(PG_FUNCTION_ARGS)
static float4 get_float4_infinity(void)
static float4 get_float4_nan(void)
static float8 get_float8_infinity(void)
static float8 get_float8_nan(void)
#define PG_FREE_IF_COPY(ptr, n)
#define PG_RETURN_UINT32(x)
#define PG_GETARG_BYTEA_PP(n)
#define PG_RETURN_BYTEA_P(x)
#define DirectFunctionCall2(func, arg1, arg2)
#define PG_GETARG_FLOAT8(n)
#define PG_RETURN_FLOAT8(x)
#define PG_GETARG_POINTER(n)
#define PG_RETURN_CSTRING(x)
#define PG_RETURN_INT64(x)
#define DirectFunctionCall1(func, arg1)
#define PG_GETARG_CSTRING(n)
#define PG_GETARG_INT64(n)
#define PG_DETOAST_DATUM_PACKED(datum)
#define PG_RETURN_UINT64(x)
#define PG_RETURN_INT16(x)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_GETARG_BOOL(n)
#define PG_RETURN_DATUM(x)
#define PG_GETARG_FLOAT4(n)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_FLOAT4(x)
#define PG_RETURN_BOOL(x)
#define PG_GETARG_INT16(n)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
#define SRF_RETURN_DONE(_funcctx)
static Datum hash_uint32(uint32 k)
static Datum hash_any_extended(const unsigned char *k, int keylen, uint64 seed)
static Datum hash_any(const unsigned char *k, int keylen)
Assert(PointerIsAligned(start, uint64))
static const FormData_pg_attribute a1
void initHyperLogLog(hyperLogLogState *cState, uint8 bwidth)
double estimateHyperLogLog(hyperLogLogState *cState)
void addHyperLogLog(hyperLogLogState *cState, uint32 hash)
static INT128 make_int128(int64 hi, uint64 lo)
static bool int128_is_zero(INT128 x)
static void int128_sub_int64_mul_int64(INT128 *i128, int64 x, int64 y)
static int int128_sign(INT128 x)
static void int128_add_int128(INT128 *i128, INT128 v)
static void int128_sub_int64(INT128 *i128, int64 v)
static INT128 int64_to_int128(int64 v)
static void int128_add_int64(INT128 *i128, int64 v)
static void int128_div_mod_int32(INT128 *i128, int32 v, int32 *remainder)
static void int128_add_int64_mul_int64(INT128 *i128, int64 x, int64 y)
#define PG_INT128_HI_INT64(i128)
#define PG_INT128_LO_UINT64(i128)
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
static uint64 pg_abs_s64(int64 a)
static bool pg_sub_s64_overflow(int64 a, int64 b, int64 *result)
static bool pg_add_u64_overflow(uint64 a, uint64 b, uint64 *result)
static bool pg_mul_u64_overflow(uint64 a, uint64 b, uint64 *result)
static uint32 pg_abs_s32(int32 a)
if(TABLE==NULL||TABLE_index==NULL)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define CHECK_FOR_INTERRUPTS()
int AggCheckCallContext(FunctionCallInfo fcinfo, MemoryContext *aggcontext)
int32 exprTypmod(const Node *expr)
Node * relabel_to_typmod(Node *expr, int32 typmod)
static bool is_funcclause(const void *clause)
#define IsA(nodeptr, _type_)
#define NUMERIC_MIN_SCALE
#define NUMERIC_MAX_PRECISION
#define NUMERIC_MAX_RESULT_SCALE
#define NUMERIC_MAX_DISPLAY_SCALE
#define NUMERIC_MIN_SIG_DIGITS
static Numeric DatumGetNumeric(Datum X)
#define PG_GETARG_NUMERIC(n)
struct NumericData * Numeric
#define NUMERIC_MAX_SCALE
#define NUMERIC_MIN_DISPLAY_SCALE
#define PG_RETURN_NUMERIC(x)
static Datum NumericGetDatum(Numeric X)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static int list_length(const List *l)
uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax)
static rewind_source * source
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
static uint32 DatumGetUInt32(Datum X)
static uint64 DatumGetUInt64(Datum X)
#define Int64GetDatumFast(X)
static Datum UInt64GetDatum(uint64 X)
static char * DatumGetCString(Datum X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
static int32 DatumGetInt32(Datum X)
static int cmp(const chr *x, const chr *y, size_t len)
struct SortSupportData * SortSupport
struct StringInfoData * StringInfo
static void initReadOnlyStringInfo(StringInfo str, char *data, int len)
MemoryContext multi_call_memory_ctx
MemoryContext agg_context
union NumericChoice choice
NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]
NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]
hyperLogLogState abbr_card
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)
bool(* abbrev_abort)(int memtupcount, SortSupport ssup)
struct NumericLong n_long
struct NumericShort n_short
static bool VARATT_IS_SHORT(const void *PTR)
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static Size VARSIZE(const void *PTR)
static char * VARDATA(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
static char * VARDATA_SHORT(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
static Size VARSIZE_SHORT(const void *PTR)