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")));
1849 ((
Const *) arg1)->constisnull) ||
1851 ((
Const *) arg2)->constisnull) ||
1852 (arg3 != NULL &&
IsA(arg3,
Const) &&
1853 ((
Const *) arg3)->constisnull))
1860 (arg3 == NULL ||
IsA(arg3,
Const)))
1916 div_var(&res, &step, &res, 0,
false,
false);
1962 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1963 errmsg(
"count must be greater than zero")));
1969 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1970 errmsg(
"lower and upper bounds cannot be NaN")));
1974 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1975 errmsg(
"lower and upper bounds must be finite")));
1988 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
1989 errmsg(
"lower bound cannot equal upper bound")));
2018 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
2019 errmsg(
"integer out of range")));
2054 sub_var(&operand_var, &bound1_var, &operand_var);
2055 sub_var(&bound2_var, &bound1_var, &bound2_var);
2057 mul_var(&operand_var, count_var, &operand_var,
2059 div_var(&operand_var, &bound2_var, result_var, 0,
false,
true);
2197 pfree(original_varatt);
2216 if (memtupcount < 10000 || nss->input_count < 10000 || !nss->estimating)
2227 if (abbr_card > 100000.0)
2231 "numeric_abbrev: estimation ends at cardinality %f"
2247 if (abbr_card < nss->input_count / 10000.0 + 0.5)
2251 "numeric_abbrev: aborting abbreviation at cardinality %f"
2252 " below threshold %f after " INT64_FORMAT " values (%d rows)",
2260 "numeric_abbrev: cardinality %f"
2362 int weight = var->
weight;
2365 if (ndigits == 0 || weight < -44)
2369 else if (weight > 83)
2375 result = ((
int64) (weight + 44) << 56);
2595 (
errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
2596 errmsg(
"invalid preceding or following size in window function")));
2693 sub_var(&basev, &offsetv, &sum);
2695 add_var(&basev, &offsetv, &sum);
2698 result = (
cmp_var(&valv, &sum) <= 0);
2700 result = (
cmp_var(&valv, &sum) >= 0);
2783 result = digit_hash ^ weight;
2923 add_var(&arg1, &arg2, &result);
2999 sub_var(&arg1, &arg2, &result);
3174 goto division_by_zero;
3189 goto division_by_zero;
3222 goto division_by_zero;
3227 div_var(&arg1, &arg2, &result, rscale,
true,
true);
3237 errcode(ERRCODE_DIVISION_BY_ZERO),
3238 errmsg(
"division by zero"));
3272 (
errcode(ERRCODE_DIVISION_BY_ZERO),
3273 errmsg(
"division by zero")));
3290 (
errcode(ERRCODE_DIVISION_BY_ZERO),
3291 errmsg(
"division by zero")));
3321 div_var(&arg1, &arg2, &result, 0,
false,
true);
3374 goto division_by_zero;
3390 goto division_by_zero;
3392 mod_var(&arg1, &arg2, &result);
3402 errcode(ERRCODE_DIVISION_BY_ZERO),
3403 errmsg(
"division by zero"));
3524 gcd_var(&arg1, &arg2, &result);
3578 gcd_var(&arg1, &arg2, &result);
3579 div_var(&arg1, &result, &result, 0,
false,
true);
3609 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3610 errmsg(
"factorial of a negative number is undefined")));
3619 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3620 errmsg(
"value overflows numeric format")));
3627 for (num = num - 1; num > 1; num--)
3634 mul_var(&result, &fact, &result, 0);
3669 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3670 errmsg(
"cannot take square root of a negative number")));
3691#if DEC_DIGITS == ((DEC_DIGITS / 2) * 2)
3694 if (
arg.weight >= 0)
3701 rscale =
Max(rscale,
arg.dscale);
3761 val *= 0.434294481903252;
3768 rscale =
Max(rscale,
arg.dscale);
3807 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3808 errmsg(
"cannot take logarithm of a negative number")));
3820 rscale =
Max(rscale,
arg.dscale);
3862 if (sign1 < 0 || sign2 < 0)
3864 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3865 errmsg(
"cannot take logarithm of a negative number")));
3867 if (sign1 == 0 || sign2 == 0)
3869 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
3870 errmsg(
"cannot take logarithm of zero")));
3895 log_var(&arg1, &arg2, &result);
3955 if (sign1 == 0 && sign2 < 0)
3957 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3958 errmsg(
"zero raised to a negative power is undefined")));
3961 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
3962 errmsg(
"a negative number raised to a non-integer power yields a complex result")));
3988 if (sign1 == 0 && sign2 > 0)
4007 abs_x_gt_one =
true;
4016 if (abs_x_gt_one == (sign2 > 0))
4067 if (sign1 == 0 && sign2 < 0)
4069 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
4070 errmsg(
"zero raised to a negative power is undefined")));
4122 last_digit_pos = var->
ndigits - 1;
4123 while (last_digit_pos >= 0 &&
4124 var->
digits[last_digit_pos] == 0)
4127 if (last_digit_pos >= 0)
4144 while (last_digit % 10 == 0)
4216 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4217 errmsg(
"lower bound cannot be NaN"));
4220 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4221 errmsg(
"lower bound cannot be infinity"));
4227 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4228 errmsg(
"upper bound cannot be NaN"));
4231 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4232 errmsg(
"upper bound cannot be infinity"));
4291 rscale = log10val2 < 0 ? 0 : log10val2;
4311 static const int pow10[] = {1, 10, 100, 1000};
4312#elif DEC_DIGITS == 2
4313 static const int pow10[] = {1, 10};
4314#elif DEC_DIGITS == 1
4315 static const int pow10[] = {1};
4317#error unsupported NBASE
4373 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4374 errmsg(
"cannot convert NaN to %s",
"integer")));
4377 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4378 errmsg(
"cannot convert infinity to %s",
"integer")));
4386 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4387 errmsg(
"integer out of range")));
4443 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4444 errmsg(
"cannot convert NaN to %s",
"bigint")));
4447 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4448 errmsg(
"cannot convert infinity to %s",
"bigint")));
4456 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4457 errmsg(
"bigint out of range")));
4492 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4493 errmsg(
"cannot convert NaN to %s",
"smallint")));
4496 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4497 errmsg(
"cannot convert infinity to %s",
"smallint")));
4505 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4506 errmsg(
"smallint out of range")));
4510 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4511 errmsg(
"smallint out of range")));
4526 char buf[DBL_DIG + 100];
4620 char buf[FLT_DIG + 100];
4688 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4689 errmsg(
"cannot convert NaN to %s",
"pg_lsn")));
4692 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4693 errmsg(
"cannot convert infinity to %s",
"pg_lsn")));
4701 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4702 errmsg(
"pg_lsn out of range")));
4737#define NA_TOTAL_COUNT(na) \
4738 ((na)->N + (na)->NaNcount + (na)->pInfcount + (na)->nInfcount)
4752 elog(
ERROR,
"aggregate function called in non-aggregate context");
4757 state->calcSumX2 = calcSumX2;
4758 state->agg_context = agg_context;
4775 state->calcSumX2 = calcSumX2;
4813 state->maxScaleCount = 1;
4816 state->maxScaleCount++;
4819 if (
state->calcSumX2)
4833 if (
state->calcSumX2)
4885 if (
state->maxScaleCount > 1 ||
state->maxScale == 0)
4891 state->maxScaleCount--;
4893 else if (
state->N == 1)
4896 state->maxScale = 0;
4897 state->maxScaleCount = 0;
4907 if (
state->calcSumX2)
4922 if (
state->calcSumX2)
4935 if (
state->calcSumX2)
4976 elog(
ERROR,
"aggregate function called in non-aggregate context");
4990 state1->
N = state2->
N;
5005 state1->
N += state2->
N;
5068 elog(
ERROR,
"aggregate function called in non-aggregate context");
5082 state1->
N = state2->
N;
5096 state1->
N += state2->
N;
5141 elog(
ERROR,
"aggregate function called in non-aggregate context");
5192 elog(
ERROR,
"aggregate function called in non-aggregate context");
5251 elog(
ERROR,
"aggregate function called in non-aggregate context");
5306 elog(
ERROR,
"aggregate function called in non-aggregate context");
5367 elog(
ERROR,
"numeric_accum_inv called with NULL state");
5416 elog(
ERROR,
"aggregate function called in non-aggregate context");
5421 state->calcSumX2 = calcSumX2;
5438 state->calcSumX2 = calcSumX2;
5449 if (
state->calcSumX2)
5462 if (
state->calcSumX2)
5532 elog(
ERROR,
"aggregate function called in non-aggregate context");
5546 state1->
N = state2->
N;
5557 state1->
N += state2->
N;
5600 elog(
ERROR,
"aggregate function called in non-aggregate context");
5633 elog(
ERROR,
"aggregate function called in non-aggregate context");
5693 elog(
ERROR,
"aggregate function called in non-aggregate context");
5707 state1->
N = state2->
N;
5717 state1->
N += state2->
N;
5737 elog(
ERROR,
"aggregate function called in non-aggregate context");
5767 elog(
ERROR,
"aggregate function called in non-aggregate context");
5804 elog(
ERROR,
"int2_accum_inv called with NULL state");
5821 elog(
ERROR,
"int4_accum_inv called with NULL state");
5838 elog(
ERROR,
"int8_accum_inv called with NULL state");
5844 elog(
ERROR,
"do_numeric_discard failed unexpectedly");
5859 elog(
ERROR,
"int8_avg_accum_inv called with NULL state");
5931 if (
state->NaNcount > 0)
5935 if (
state->pInfcount > 0 &&
state->nInfcount > 0)
5937 if (
state->pInfcount > 0)
5939 if (
state->nInfcount > 0)
5965 if (
state->NaNcount > 0)
5969 if (
state->pInfcount > 0 &&
state->nInfcount > 0)
5971 if (
state->pInfcount > 0)
5973 if (
state->nInfcount > 0)
5997 bool variance,
bool sample,
6019 if (sample && totCount <= 1)
6031 if (
state->NaNcount > 0 ||
state->pInfcount > 0 ||
state->nInfcount > 0)
6047 rscale = vsumX.
dscale * 2;
6049 mul_var(&vsumX, &vsumX, &vsumX, rscale);
6050 mul_var(&vN, &vsumX2, &vsumX2, rscale);
6051 sub_var(&vsumX2, &vsumX, &vsumX2);
6061 mul_var(&vN, &vNminus1, &vNminus1, 0);
6063 mul_var(&vN, &vN, &vNminus1, 0);
6065 div_var(&vsumX2, &vNminus1, &vsumX, rscale,
true,
true);
6149 bool variance,
bool sample,
6405 elog(
ERROR,
"expected 2-element int8 array");
6433 elog(
ERROR,
"expected 2-element int8 array");
6451 elog(
ERROR,
"aggregate function called in non-aggregate context");
6458 elog(
ERROR,
"expected 2-element int8 array");
6462 elog(
ERROR,
"expected 2-element int8 array");
6468 state1->
sum += state2->
sum;
6492 elog(
ERROR,
"expected 2-element int8 array");
6520 elog(
ERROR,
"expected 2-element int8 array");
6539 elog(
ERROR,
"expected 2-element int8 array");
6543 if (transdata->
count == 0)
6564 elog(
ERROR,
"expected 2-element int8 array");
6568 if (transdata->
count == 0)
6620 for (
i = 0;
i < ndigits;
i++)
6746 bool have_dp =
false;
6748 unsigned char *decdigits;
6781 if (!isdigit((
unsigned char) *cp))
6782 goto invalid_syntax;
6792 if (isdigit((
unsigned char) *cp))
6794 decdigits[
i++] = *cp++ -
'0';
6800 else if (*cp ==
'.')
6803 goto invalid_syntax;
6808 goto invalid_syntax;
6810 else if (*cp ==
'_')
6814 if (!isdigit((
unsigned char) *cp))
6815 goto invalid_syntax;
6826 if (*cp ==
'e' || *cp ==
'E')
6844 else if (*cp ==
'-')
6851 if (!isdigit((
unsigned char) *cp))
6852 goto invalid_syntax;
6856 if (isdigit((
unsigned char) *cp))
6858 exponent = exponent * 10 + (*cp++ -
'0');
6862 else if (*cp ==
'_')
6866 if (!isdigit((
unsigned char) *cp))
6867 goto invalid_syntax;
6874 exponent = -exponent;
6876 dweight += (int) exponent;
6877 dscale -= (int) exponent;
6892 offset = (weight + 1) *
DEC_DIGITS - (dweight + 1);
6897 dest->weight = weight;
6898 dest->dscale = dscale;
6903 while (ndigits-- > 0)
6906 *
digits++ = ((decdigits[
i] * 10 + decdigits[
i + 1]) * 10 +
6907 decdigits[
i + 2]) * 10 + decdigits[
i + 3];
6908#elif DEC_DIGITS == 2
6909 *
digits++ = decdigits[
i] * 10 + decdigits[
i + 1];
6910#elif DEC_DIGITS == 1
6913#error unsupported NBASE
6930 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
6931 errmsg(
"value overflows numeric format")));
6935 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
6936 errmsg(
"invalid input syntax for type %s: \"%s\"",
6947 return dig >=
'0' && dig <=
'9' ? dig -
'0' :
6948 dig >=
'a' && dig <=
'f' ? dig -
'a' + 10 :
6949 dig >=
'A' && dig <=
'F' ? dig -
'A' + 10 : -1;
6974 const char **endptr,
Node *escontext)
6976 const char *firstdigit = cp;
6998 if (isxdigit((
unsigned char) *cp))
7020 else if (*cp ==
'_')
7024 if (!isxdigit((
unsigned char) *cp))
7025 goto invalid_syntax;
7035 if (*cp >=
'0' && *cp <=
'7')
7054 tmp = tmp * 8 + (*cp++ -
'0');
7057 else if (*cp ==
'_')
7061 if (*cp < '0' || *cp >
'7')
7062 goto invalid_syntax;
7072 if (*cp >=
'0' && *cp <=
'1')
7091 tmp = tmp * 2 + (*cp++ -
'0');
7094 else if (*cp ==
'_')
7098 if (*cp < '0' || *cp >
'1')
7099 goto invalid_syntax;
7107 goto invalid_syntax;
7111 goto invalid_syntax;
7133 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7134 errmsg(
"value overflows numeric format")));
7138 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
7139 errmsg(
"invalid input syntax for type %s: \"%s\"",
7204 if (
value->ndigits > 0)
7205 memcpy(newbuf + 1,
value->digits,
7212 dest->digits = newbuf + 1;
7271 for (d = 0; d <= var->
weight; d++)
7277 bool putit = (d > 0);
7296#elif DEC_DIGITS == 2
7299 if (d1 > 0 || d > 0)
7302#elif DEC_DIGITS == 1
7305#error unsupported NBASE
7318 endcp = cp + dscale;
7423 div_var(var, &tmp_var, &tmp_var, rscale,
true,
true);
7435 len = strlen(sig_out) + 13;
7482 for (
i = 0;
i <
len;
i++)
7498 memcpy(res, num,
VARSIZE(num));
7513 int weight = var->
weight;
7543 while (n > 0 && *
digits == 0)
7550 while (n > 0 &&
digits[n - 1] == 0)
7566 result->choice.n_short.n_header =
7578 result->choice.n_long.n_sign_dscale =
7580 result->choice.n_long.n_weight = weight;
7591 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7592 errmsg(
"value overflows numeric format")));
7667 else if (dig < 1000)
7669#elif DEC_DIGITS == 2
7672#elif DEC_DIGITS == 1
7675#error unsupported NBASE
7679 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7680 errmsg(
"numeric field overflow"),
7681 errdetail(
"A field with precision %d, scale %d must round to an absolute value less than %s%d.",
7730 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
7731 errmsg(
"numeric field overflow"),
7732 errdetail(
"A field with precision %d, scale %d cannot hold an infinite value.",
7733 precision,
scale)));
7773 Assert(weight >= 0 && ndigits <= weight + 1);
7783 for (
i = 1;
i <= weight;
i++)
7850 newuval = uval /
NBASE;
7851 *ptr = uval - newuval *
NBASE;
7856 var->
weight = ndigits - 1;
7901 Assert(weight >= 0 && ndigits <= weight + 1);
7906 for (
i = 1;
i <= weight;
i++)
7964 var->
weight = ndigits - 1;
7980 val = strtod(tmp, &endptr);
7981 if (*endptr !=
'\0')
7985 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
7986 errmsg(
"invalid input syntax for type %s: \"%s\"",
7987 "double precision", tmp)));
8019 int var1weight,
int var1sign,
8021 int var2weight,
int var2sign)
8023 if (var1ndigits == 0)
8025 if (var2ndigits == 0)
8031 if (var2ndigits == 0)
8043 var2digits, var2ndigits, var2weight);
8050 var1digits, var1ndigits, var1weight);
8303 int res_ndigitpairs;
8316 int var1ndigitpairs;
8317 int var2ndigitpairs;
8346 var1digits = var1->
digits;
8347 var2digits = var2->
digits;
8349 if (var1ndigits == 0)
8361 if (var1ndigits <= 6 && rscale == var1->dscale + var2->
dscale)
8397 var1ndigitpairs = (var1ndigits + 1) / 2;
8398 var2ndigitpairs = (var2ndigits + 1) / 2;
8401 res_ndigits = var1ndigits + var2ndigits;
8404 res_ndigitpairs = res_ndigits / 2 + 1;
8407 pair_offset = res_ndigitpairs - var1ndigitpairs - var2ndigitpairs + 1;
8410 res_weight = var1->
weight + var2->
weight + 1 + 2 * res_ndigitpairs -
8411 res_ndigits - (var1ndigits & 1) - (var2ndigits & 1);
8418 res_ndigitpairs =
Min(res_ndigitpairs, maxdigitpairs);
8419 res_ndigits = 2 * res_ndigitpairs;
8427 if (res_ndigitpairs <= pair_offset)
8434 var1ndigitpairs =
Min(var1ndigitpairs, res_ndigitpairs - pair_offset);
8435 var2ndigitpairs =
Min(var2ndigitpairs, res_ndigitpairs - pair_offset);
8461 var2ndigitpairs *
sizeof(
uint32));
8464 var2digitpairs = (
uint32 *) (dig + res_ndigitpairs);
8466 for (i2 = 0; i2 < var2ndigitpairs - 1; i2++)
8467 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE + var2digits[2 * i2 + 1];
8469 if (2 * i2 + 1 < var2ndigits)
8470 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE + var2digits[2 * i2 + 1];
8472 var2digitpairs[i2] = var2digits[2 * i2] *
NBASE;
8487 i1 = var1ndigitpairs - 1;
8488 if (2 * i1 + 1 < var1ndigits)
8489 var1digitpair = var1digits[2 * i1] *
NBASE + var1digits[2 * i1 + 1];
8491 var1digitpair = var1digits[2 * i1] *
NBASE;
8492 maxdig = var1digitpair;
8494 i2limit =
Min(var2ndigitpairs, res_ndigitpairs - i1 - pair_offset);
8495 dig_i1_off = &dig[i1 + pair_offset];
8497 memset(dig, 0, (i1 + pair_offset) *
sizeof(
uint64));
8498 for (i2 = 0; i2 < i2limit; i2++)
8499 dig_i1_off[i2] = (
uint64) var1digitpair * var2digitpairs[i2];
8506 for (i1 = i1 - 1; i1 >= 0; i1--)
8508 var1digitpair = var1digits[2 * i1] *
NBASE + var1digits[2 * i1 + 1];
8509 if (var1digitpair == 0)
8513 maxdig += var1digitpair;
8518 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
8520 newdig = dig[
i] + carry;
8532 maxdig = 1 + var1digitpair;
8536 i2limit =
Min(var2ndigitpairs, res_ndigitpairs - i1 - pair_offset);
8537 dig_i1_off = &dig[i1 + pair_offset];
8539 for (i2 = 0; i2 < i2limit; i2++)
8540 dig_i1_off[i2] += (
uint64) var1digitpair * var2digitpairs[i2];
8549 res_digits = result->
digits;
8551 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
8553 newdig = dig[
i] + carry;
8571 result->
weight = res_weight;
8572 result->
sign = res_sign;
8593 int var1ndigits = var1->
ndigits;
8594 int var2ndigits = var2->
ndigits;
8606 Assert(var1ndigits >= 1);
8607 Assert(var1ndigits <= 6);
8608 Assert(var2ndigits >= var1ndigits);
8622 res_ndigits = var1ndigits + var2ndigits;
8627 res_digits = res_buf + 1;
8634#define PRODSUM1(v1,i1,v2,i2) ((v1)[(i1)] * (v2)[(i2)])
8635#define PRODSUM2(v1,i1,v2,i2) (PRODSUM1(v1,i1,v2,i2) + (v1)[(i1)+1] * (v2)[(i2)-1])
8636#define PRODSUM3(v1,i1,v2,i2) (PRODSUM2(v1,i1,v2,i2) + (v1)[(i1)+2] * (v2)[(i2)-2])
8637#define PRODSUM4(v1,i1,v2,i2) (PRODSUM3(v1,i1,v2,i2) + (v1)[(i1)+3] * (v2)[(i2)-3])
8638#define PRODSUM5(v1,i1,v2,i2) (PRODSUM4(v1,i1,v2,i2) + (v1)[(i1)+4] * (v2)[(i2)-4])
8639#define PRODSUM6(v1,i1,v2,i2) (PRODSUM5(v1,i1,v2,i2) + (v1)[(i1)+5] * (v2)[(i2)-5])
8641 switch (var1ndigits)
8651 for (
int i = var2ndigits - 1;
i >= 0;
i--)
8653 term =
PRODSUM1(var1digits, 0, var2digits,
i) + carry;
8655 carry = term /
NBASE;
8669 term =
PRODSUM1(var1digits, 1, var2digits, var2ndigits - 1);
8671 carry = term /
NBASE;
8674 for (
int i = var2ndigits - 1;
i >= 1;
i--)
8676 term =
PRODSUM2(var1digits, 0, var2digits,
i) + carry;
8678 carry = term /
NBASE;
8691 term =
PRODSUM1(var1digits, 2, var2digits, var2ndigits - 1);
8693 carry = term /
NBASE;
8695 term =
PRODSUM2(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8697 carry = term /
NBASE;
8700 for (
int i = var2ndigits - 1;
i >= 2;
i--)
8702 term =
PRODSUM3(var1digits, 0, var2digits,
i) + carry;
8704 carry = term /
NBASE;
8717 term =
PRODSUM1(var1digits, 3, var2digits, var2ndigits - 1);
8719 carry = term /
NBASE;
8721 term =
PRODSUM2(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8723 carry = term /
NBASE;
8725 term =
PRODSUM3(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8727 carry = term /
NBASE;
8730 for (
int i = var2ndigits - 1;
i >= 3;
i--)
8732 term =
PRODSUM4(var1digits, 0, var2digits,
i) + carry;
8734 carry = term /
NBASE;
8747 term =
PRODSUM1(var1digits, 4, var2digits, var2ndigits - 1);
8749 carry = term /
NBASE;
8751 term =
PRODSUM2(var1digits, 3, var2digits, var2ndigits - 1) + carry;
8753 carry = term /
NBASE;
8755 term =
PRODSUM3(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8757 carry = term /
NBASE;
8759 term =
PRODSUM4(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8761 carry = term /
NBASE;
8764 for (
int i = var2ndigits - 1;
i >= 4;
i--)
8766 term =
PRODSUM5(var1digits, 0, var2digits,
i) + carry;
8768 carry = term /
NBASE;
8781 term =
PRODSUM1(var1digits, 5, var2digits, var2ndigits - 1);
8783 carry = term /
NBASE;
8785 term =
PRODSUM2(var1digits, 4, var2digits, var2ndigits - 1) + carry;
8787 carry = term /
NBASE;
8789 term =
PRODSUM3(var1digits, 3, var2digits, var2ndigits - 1) + carry;
8791 carry = term /
NBASE;
8793 term =
PRODSUM4(var1digits, 2, var2digits, var2ndigits - 1) + carry;
8795 carry = term /
NBASE;
8797 term =
PRODSUM5(var1digits, 1, var2digits, var2ndigits - 1) + carry;
8799 carry = term /
NBASE;
8802 for (
int i = var2ndigits - 1;
i >= 5;
i--)
8804 term =
PRODSUM6(var1digits, 0, var2digits,
i) + carry;
8806 carry = term /
NBASE;
8815 switch (var1ndigits)
8818 term =
PRODSUM5(var1digits, 0, var2digits, 4) + carry;
8820 carry = term /
NBASE;
8823 term =
PRODSUM4(var1digits, 0, var2digits, 3) + carry;
8825 carry = term /
NBASE;
8828 term =
PRODSUM3(var1digits, 0, var2digits, 2) + carry;
8830 carry = term /
NBASE;
8833 term =
PRODSUM2(var1digits, 0, var2digits, 1) + carry;
8835 carry = term /
NBASE;
8838 term =
PRODSUM1(var1digits, 0, var2digits, 0) + carry;
8846 result->
ndigits = res_ndigits;
8847 result->
buf = res_buf;
8848 result->
digits = res_digits;
8849 result->
weight = res_weight;
8850 result->
sign = res_sign;
8878 int rscale,
bool round,
bool exact)
8880 int var1ndigits = var1->
ndigits;
8881 int var2ndigits = var2->
ndigits;
8885 int var1ndigitpairs;
8886 int var2ndigitpairs;
8887 int res_ndigitpairs;
8888 int div_ndigitpairs;
8908 if (var2ndigits == 0 || var2->
digits[0] == 0)
8910 (
errcode(ERRCODE_DIVISION_BY_ZERO),
8911 errmsg(
"division by zero")));
8920 if (var2ndigits <= 2)
8923 int idivisor_weight;
8925 idivisor = var2->
digits[0];
8926 idivisor_weight = var2->
weight;
8927 if (var2ndigits == 2)
8933 idivisor = -idivisor;
8935 div_var_int(var1, idivisor, idivisor_weight, result, rscale, round);
8939 if (var2ndigits <= 4)
8942 int idivisor_weight;
8944 idivisor = var2->
digits[0];
8945 idivisor_weight = var2->
weight;
8946 for (
i = 1;
i < var2ndigits;
i++)
8952 idivisor = -idivisor;
8954 div_var_int64(var1, idivisor, idivisor_weight, result, rscale, round);
8964 if (var1ndigits == 0)
9000 res_ndigits =
Max(res_ndigits, 1);
9015 var1ndigitpairs = (var1ndigits + 1) / 2;
9016 var2ndigitpairs = (var2ndigits + 1) / 2;
9017 res_ndigitpairs = (res_ndigits + 1) / 2;
9018 res_ndigits = 2 * res_ndigitpairs;
9035 div_ndigitpairs = res_ndigitpairs + var2ndigitpairs;
9036 var1ndigitpairs =
Min(var1ndigitpairs, div_ndigitpairs);
9040 div_ndigitpairs = res_ndigitpairs;
9041 var1ndigitpairs =
Min(var1ndigitpairs, div_ndigitpairs);
9042 var2ndigitpairs =
Min(var2ndigitpairs, div_ndigitpairs);
9054 var2ndigitpairs *
sizeof(
int32));
9055 divisor = (
int32 *) (dividend + div_ndigitpairs + 1);
9058 for (
i = 0;
i < var1ndigitpairs - 1;
i++)
9061 if (2 *
i + 1 < var1ndigits)
9066 memset(dividend +
i + 1, 0, (div_ndigitpairs -
i) *
sizeof(
int64));
9069 for (
i = 0;
i < var2ndigitpairs - 1;
i++)
9072 if (2 *
i + 1 < var2ndigits)
9090 fdivisor = (double) divisor[0] *
NBASE_SQR;
9091 if (var2ndigitpairs > 1)
9092 fdivisor += (double) divisor[1];
9093 fdivisorinverse = 1.0 / fdivisor;
9120 for (qi = 0; qi < res_ndigitpairs; qi++)
9123 fdividend = (double) dividend[qi] *
NBASE_SQR;
9124 fdividend += (double) dividend[qi + 1];
9127 fquotient = fdividend * fdivisorinverse;
9128 qdigit = (fquotient >= 0.0) ? ((
int32) fquotient) :
9129 (((
int32) fquotient) - 1);
9134 maxdiv += i64abs(qdigit);
9145 for (
i =
Min(qi + var2ndigitpairs - 2, div_ndigitpairs - 1);
i > qi;
i--)
9147 newdig = dividend[
i] + carry;
9150 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9160 dividend[
i] = newdig;
9162 dividend[qi] += carry;
9176 fdividend = (double) dividend[qi] *
NBASE_SQR;
9177 fdividend += (double) dividend[qi + 1];
9178 fquotient = fdividend * fdivisorinverse;
9179 qdigit = (fquotient >= 0.0) ? ((
int32) fquotient) :
9180 (((
int32) fquotient) - 1);
9182 maxdiv += i64abs(qdigit);
9202 int istop =
Min(var2ndigitpairs, div_ndigitpairs - qi);
9203 int64 *dividend_qi = ÷nd[qi];
9205 for (
i = 0;
i < istop;
i++)
9206 dividend_qi[
i] -= (
int64) qdigit * divisor[
i];
9235 dividend[qi + 1] += dividend[qi] *
NBASE_SQR;
9237 dividend[qi] = qdigit;
9257 for (
i = var2ndigitpairs - 2;
i >= 0;
i--)
9262 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9290 for (
i = var2ndigitpairs - 1;
i > 0;
i--)
9324 for (
i = 0;
i < var2ndigitpairs;
i++)
9339 for (
i = var2ndigitpairs - 1;
i > 0;
i--)
9370 res_digits = result->
digits;
9372 for (
i = res_ndigitpairs - 1;
i >= 0;
i--)
9374 newdig = dividend[
i] + carry;
9377 carry = -((-newdig - 1) /
NBASE_SQR) - 1;
9397 result->
weight = res_weight;
9398 result->
sign = res_sign;
9422 int var_ndigits = var->
ndigits;
9434 errcode(ERRCODE_DIVISION_BY_ZERO),
9435 errmsg(
"division by zero"));
9438 if (var_ndigits == 0)
9454 res_weight = var->
weight - ival_weight;
9458 res_ndigits =
Max(res_ndigits, 1);
9465 res_digits = res_buf + 1;
9477 divisor = abs(ival);
9479 if (divisor <= UINT_MAX /
NBASE)
9484 for (
i = 0;
i < res_ndigits;
i++)
9486 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9488 carry = carry % divisor;
9496 for (
i = 0;
i < res_ndigits;
i++)
9498 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9500 carry = carry % divisor;
9506 result->
ndigits = res_ndigits;
9507 result->
buf = res_buf;
9508 result->
digits = res_digits;
9509 result->
weight = res_weight;
9510 result->
sign = res_sign;
9538 int var_ndigits = var->
ndigits;
9550 errcode(ERRCODE_DIVISION_BY_ZERO),
9551 errmsg(
"division by zero"));
9554 if (var_ndigits == 0)
9570 res_weight = var->
weight - ival_weight;
9574 res_ndigits =
Max(res_ndigits, 1);
9581 res_digits = res_buf + 1;
9593 divisor = i64abs(ival);
9600 for (
i = 0;
i < res_ndigits;
i++)
9602 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9604 carry = carry % divisor;
9612 for (
i = 0;
i < res_ndigits;
i++)
9614 carry = carry *
NBASE + (
i < var_ndigits ? var_digits[
i] : 0);
9616 carry = carry % divisor;
9622 result->
ndigits = res_ndigits;
9623 result->
buf = res_buf;
9624 result->
digits = res_digits;
9625 result->
weight = res_weight;
9626 result->
sign = res_sign;
9670 firstdigit1 = var1->
digits[
i];
9671 if (firstdigit1 != 0)
9682 firstdigit2 = var2->
digits[
i];
9683 if (firstdigit2 != 0)
9694 qweight = weight1 - weight2;
9695 if (firstdigit1 <= firstdigit2)
9727 div_var(var1, var2, &tmp, 0,
false,
true);
9758 div_var(var1, var2, &q, 0,
false,
false);
9784 while (
cmp_abs(&r, var2) >= 0)
9893 result->
dscale = res_dscale;
9909 mod_var(&tmp_arg, result, &mod);
9916 result->
dscale = res_dscale;
9965 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
9966 errmsg(
"cannot take square root of a negative number")));
9979 if (
arg->weight >= 0)
9980 res_weight =
arg->weight / 2;
9982 res_weight = -((-
arg->weight - 1) / 2 + 1);
9990 if (rscale + 1 >= 0)
9993 res_ndigits = res_weight + 1 - (-rscale - 1) /
DEC_DIGITS;
9994 res_ndigits =
Max(res_ndigits, 1);
10002 src_ndigits =
arg->weight + 1 + (res_ndigits - res_weight - 1) * 2;
10003 src_ndigits =
Max(src_ndigits, 1);
10073 while ((ndigits[step] = src_ndigits) > 4)
10076 blen = src_ndigits / 4;
10077 if (blen * 4 == src_ndigits &&
arg->digits[0] <
NBASE / 4)
10081 src_ndigits -= 2 * blen;
10093 arg_int64 =
arg->digits[0];
10094 for (src_idx = 1; src_idx < src_ndigits; src_idx++)
10096 arg_int64 *=
NBASE;
10097 if (src_idx < arg->ndigits)
10098 arg_int64 +=
arg->digits[src_idx];
10101 s_int64 = (
int64) sqrt((
double) arg_int64);
10102 r_int64 = arg_int64 - s_int64 * s_int64;
10114 while (r_int64 < 0 || r_int64 > 2 * s_int64)
10116 s_int64 = (s_int64 + arg_int64 / s_int64) / 2;
10117 r_int64 = arg_int64 - s_int64 * s_int64;
10140 while (step >= 0 && (src_ndigits = ndigits[step]) <= 8)
10151 blen = (src_ndigits - src_idx) / 2;
10158 for (
i = 0;
i < blen;
i++, src_idx++)
10162 if (src_idx < arg->ndigits)
10163 a1 +=
arg->digits[src_idx];
10166 for (
i = 0;
i < blen;
i++, src_idx++)
10169 if (src_idx < arg->ndigits)
10170 a0 +=
arg->digits[src_idx];
10174 numer = r_int64 *
b +
a1;
10175 denom = 2 * s_int64;
10177 u = numer - q * denom;
10180 s_int64 = s_int64 *
b + q;
10181 r_int64 = u *
b + a0 - q * q;
10186 r_int64 += s_int64;
10188 r_int64 += s_int64;
10191 Assert(src_idx == src_ndigits);
10205 s_int128 = s_int64;
10206 r_int128 = r_int64;
10214 while (step >= 0 && (src_ndigits = ndigits[step]) <= 16)
10225 blen = (src_ndigits - src_idx) / 2;
10232 for (
i = 0;
i < blen;
i++, src_idx++)
10236 if (src_idx < arg->ndigits)
10237 a1 +=
arg->digits[src_idx];
10240 for (
i = 0;
i < blen;
i++, src_idx++)
10243 if (src_idx < arg->ndigits)
10244 a0 +=
arg->digits[src_idx];
10248 numer = r_int128 *
b +
a1;
10249 denom = 2 * s_int128;
10251 u = numer - q * denom;
10254 s_int128 = s_int128 *
b + q;
10255 r_int128 = u *
b + a0 - q * q;
10260 r_int128 += s_int128;
10262 r_int128 += s_int128;
10265 Assert(src_idx == src_ndigits);
10298 src_ndigits = ndigits[step];
10299 blen = (src_ndigits - src_idx) / 2;
10302 if (src_idx < arg->ndigits)
10304 tmp_len =
Min(blen,
arg->ndigits - src_idx);
10306 memcpy(a1_var.
digits,
arg->digits + src_idx,
10308 a1_var.
weight = blen - 1;
10320 if (src_idx < arg->ndigits)
10322 tmp_len =
Min(blen,
arg->ndigits - src_idx);
10324 memcpy(a0_var.
digits,
arg->digits + src_idx,
10326 a0_var.
weight = blen - 1;
10341 add_var(&q_var, &a1_var, &q_var);
10342 add_var(&s_var, &s_var, &u_var);
10347 add_var(&s_var, &q_var, &s_var);
10357 add_var(&u_var, &a0_var, &u_var);
10358 mul_var(&q_var, &q_var, &q_var, 0);
10363 sub_var(&u_var, &q_var, &r_var);
10367 add_var(&r_var, &s_var, &r_var);
10369 add_var(&r_var, &s_var, &r_var);
10375 if (
cmp_var(&u_var, &q_var) < 0)
10379 Assert(src_idx == src_ndigits);
10387 result->
weight = res_weight;
10439 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
10440 errmsg(
"value overflows numeric format")));
10442 result->
dscale = rscale;
10447 dweight = (int) (
val * 0.434294481903252);
10456 if (fabs(
val) > 0.01)
10461 while (fabs(
val) > 0.01)
10467 local_rscale =
x.dscale + ndiv2;
10480 sig_digits = 1 + dweight + rscale + (int) (ndiv2 * 0.301029995663981);
10481 sig_digits =
Max(sig_digits, 0) + 8;
10483 local_rscale = sig_digits - 1;
10497 div_var_int(&elem, ni, 0, &elem, local_rscale,
true);
10501 add_var(result, &elem, result);
10503 mul_var(&elem, &
x, &elem, local_rscale);
10505 div_var_int(&elem, ni, 0, &elem, local_rscale,
true);
10513 while (ndiv2-- > 0)
10517 mul_var(result, result, result, local_rscale);
10565 ln_dweight =
x.weight *
DEC_DIGITS + (int) log10(
x.digits[0]);
10602 ln_var = log((
double)
digits) + dweight * 2.302585092994046;
10603 ln_dweight = (int) log10(fabs(
ln_var));
10636 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
10637 errmsg(
"cannot take logarithm of zero")));
10640 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
10641 errmsg(
"cannot take logarithm of a negative number")));
10669 local_rscale = rscale -
x.weight *
DEC_DIGITS / 2 + 8;
10676 local_rscale = rscale -
x.weight *
DEC_DIGITS / 2 + 8;
10697 local_rscale = rscale + (int) ((nsqrt + 1) * 0.301029995663981) + 8;
10701 div_var(result, &elem, result, local_rscale,
true,
false);
10703 mul_var(result, result, &
x, local_rscale);
10710 mul_var(&xx, &
x, &xx, local_rscale);
10711 div_var_int(&xx, ni, 0, &elem, local_rscale,
true);
10716 add_var(result, &elem, result);
10723 mul_var(result, &fact, result, rscale);
10744 int ln_base_dweight;
10745 int ln_num_dweight;
10746 int result_dweight;
10748 int ln_base_rscale;
10757 result_dweight = ln_num_dweight - ln_base_dweight;
10774 ln_base_rscale = rscale + result_dweight - ln_base_dweight + 8;
10777 ln_num_rscale = rscale + result_dweight - ln_num_dweight + 8;
10781 ln_var(base, &ln_base, ln_base_rscale);
10782 ln_var(num, &ln_num, ln_num_rscale);
10785 div_var(&ln_num, &ln_base, result, rscale,
true,
false);
10856 (
errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
10857 errmsg(
"a negative number raised to a non-integer power yields a complex result")));
10900 local_rscale = 8 - ln_dweight;
10903 ln_var(base, &ln_base, local_rscale);
10905 mul_var(&ln_base, exp, &ln_num, local_rscale);
10914 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
10915 errmsg(
"value overflows numeric format")));
10921 val *= 0.434294481903252;
10931 sig_digits = rscale + (int)
val;
10932 sig_digits =
Max(sig_digits, 0);
10935 local_rscale = sig_digits - ln_dweight + 8;
10940 ln_var(base, &ln_base, local_rscale);
10942 mul_var(&ln_base, exp, &ln_num, local_rscale);
10944 exp_var(&ln_num, result, rscale);
11000 f = exp * (log10(f) + p);
11008 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
11009 errmsg(
"value overflows numeric format")));
11024 rscale =
Max(rscale, exp_dscale);
11040 result->
dscale = rscale;
11050 mul_var(base, base, result, rscale);
11061 (
errcode(ERRCODE_DIVISION_BY_ZERO),
11062 errmsg(
"division by zero")));
11064 result->
dscale = rscale;
11082 sig_digits = 1 + rscale + (int) f;
11089 sig_digits += (int) log(fabs((
double) exp)) + 8;
11105 while ((mask >>= 1) > 0)
11113 local_rscale =
Min(local_rscale, 2 * base_prod.
dscale);
11116 mul_var(&base_prod, &base_prod, &base_prod, local_rscale);
11120 local_rscale = sig_digits -
11122 local_rscale =
Min(local_rscale,
11126 mul_var(&base_prod, result, result, local_rscale);
11143 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
11144 errmsg(
"value overflows numeric format")));
11173 result->
dscale = exp < 0 ? -exp : 0;
11185 result->
digits[0] *= 10;
11202 int rlen64_ndigits;
11212 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
11213 errmsg(
"lower bound must be less than or equal to upper bound"));
11219 result->
dscale = rscale;
11238 for (
i = 0;
i < n;
i++)
11265 rlen64_ndigits = 1;
11266 while (rlen64_ndigits < res_ndigits && rlen64_ndigits < 4)
11269 if (rlen64_ndigits < rlen.
ndigits)
11270 rlen64 += rlen.
digits[rlen64_ndigits];
11284 result->
dscale = rscale;
11285 res_digits = result->
digits;
11294 if (rlen64_ndigits == res_ndigits && pow10 != 1)
11299 for (
i = rlen64_ndigits - 1;
i >= 0;
i--)
11302 rand = rand /
NBASE;
11309 whole_ndigits = res_ndigits;
11314 i = rlen64_ndigits;
11315 while (
i < whole_ndigits - 3)
11320 rand = rand /
NBASE;
11322 rand = rand /
NBASE;
11324 rand = rand /
NBASE;
11329 while (
i < whole_ndigits)
11336 if (
i < res_ndigits)
11347 }
while (
cmp_var(result, &rlen) > 0);
11350 add_var(result, rmin, result);
11390 const NumericDigit *var2digits,
int var2ndigits,
int var2weight)
11397 while (var1weight > var2weight && i1 < var1ndigits)
11399 if (var1digits[i1++] != 0)
11403 while (var2weight > var1weight && i2 < var2ndigits)
11405 if (var2digits[i2++] != 0)
11412 if (var1weight == var2weight)
11414 while (i1 < var1ndigits && i2 < var2ndigits)
11416 int stat = var1digits[i1++] - var2digits[i2++];
11431 while (i1 < var1ndigits)
11433 if (var1digits[i1++] != 0)
11436 while (i2 < var2ndigits)
11438 if (var2digits[i2++] != 0)
11469 int var1ndigits = var1->
ndigits;
11470 int var2ndigits = var2->
ndigits;
11481 res_rscale =
Max(rscale1, rscale2);
11483 res_ndigits = res_rscale + res_weight + 1;
11484 if (res_ndigits <= 0)
11489 res_digits = res_buf + 1;
11491 i1 = res_rscale + var1->
weight + 1;
11492 i2 = res_rscale + var2->
weight + 1;
11493 for (
i = res_ndigits - 1;
i >= 0;
i--)
11497 if (i1 >= 0 && i1 < var1ndigits)
11498 carry += var1digits[i1];
11499 if (i2 >= 0 && i2 < var2ndigits)
11500 carry += var2digits[i2];
11502 if (carry >=
NBASE)
11504 res_digits[
i] = carry -
NBASE;
11509 res_digits[
i] = carry;
11517 result->
ndigits = res_ndigits;
11518 result->
buf = res_buf;
11519 result->
digits = res_digits;
11520 result->
weight = res_weight;
11521 result->
dscale = res_dscale;
11554 int var1ndigits = var1->
ndigits;
11555 int var2ndigits = var2->
ndigits;
11559 res_weight = var1->
weight;
11566 res_rscale =
Max(rscale1, rscale2);
11568 res_ndigits = res_rscale + res_weight + 1;
11569 if (res_ndigits <= 0)
11574 res_digits = res_buf + 1;
11576 i1 = res_rscale + var1->
weight + 1;
11577 i2 = res_rscale + var2->
weight + 1;
11578 for (
i = res_ndigits - 1;
i >= 0;
i--)
11582 if (i1 >= 0 && i1 < var1ndigits)
11583 borrow += var1digits[i1];
11584 if (i2 >= 0 && i2 < var2ndigits)
11585 borrow -= var2digits[i2];
11589 res_digits[
i] = borrow +
NBASE;
11594 res_digits[
i] = borrow;
11602 result->
ndigits = res_ndigits;
11603 result->
buf = res_buf;
11604 result->
digits = res_digits;
11605 result->
weight = res_weight;
11606 result->
dscale = res_dscale;
11650 if (ndigits < var->ndigits ||
11651 (ndigits == var->
ndigits && di > 0))
11669#elif DEC_DIGITS == 2
11672#error unsupported NBASE
11674 extra =
digits[--ndigits] % pow10;
11675 digits[ndigits] -= extra;
11677 if (extra >= pow10 / 2)
11679 pow10 +=
digits[ndigits];
11680 if (pow10 >=
NBASE)
11685 digits[ndigits] = pow10;
11693 carry +=
digits[--ndigits];
11694 if (carry >=
NBASE)
11701 digits[ndigits] = carry;
11750 if (ndigits <= var->ndigits)
11769#elif DEC_DIGITS == 2
11772#error unsupported NBASE
11774 extra =
digits[--ndigits] % pow10;
11775 digits[ndigits] -= extra;
11794 while (ndigits > 0 && *
digits == 0)
11802 while (ndigits > 0 &&
digits[ndigits - 1] == 0)
11847 int32 *accum_digits;
11876 val_ndigits =
val->ndigits;
11877 val_digits =
val->digits;
11880 for (val_i = 0; val_i < val_ndigits; val_i++)
11882 accum_digits[
i] += (
int32) val_digits[val_i];
11922 for (
i = ndigits - 1;
i >= 0;
i--)
11924 newdig = dig[
i] + carry;
11925 if (newdig >=
NBASE)
11927 carry = newdig /
NBASE;
11928 newdig -= carry *
NBASE;
11941 for (
i = ndigits - 1;
i >= 0;
i--)
11943 newdig = dig[
i] + carry;
11944 if (newdig >=
NBASE)
11946 carry = newdig /
NBASE;
11947 newdig -= carry *
NBASE;
11968 int old_weight = accum->
weight;
11969 int old_ndigits = accum->
ndigits;
11975 accum_weight = old_weight;
11976 accum_ndigits = old_ndigits;
11987 if (
val->weight >= accum_weight)
11989 accum_weight =
val->weight + 1;
11990 accum_ndigits = accum_ndigits + (accum_weight - old_weight);
12005 accum_rscale = accum_ndigits - accum_weight - 1;
12006 val_rscale =
val->ndigits -
val->weight - 1;
12007 if (val_rscale > accum_rscale)
12008 accum_ndigits = accum_ndigits + (val_rscale - accum_rscale);
12010 if (accum_ndigits != old_ndigits ||
12011 accum_weight != old_weight)
12013 int32 *new_pos_digits;
12014 int32 *new_neg_digits;
12017 weightdiff = accum_weight - old_weight;
12019 new_pos_digits =
palloc0(accum_ndigits *
sizeof(
int32));
12020 new_neg_digits =
palloc0(accum_ndigits *
sizeof(
int32));
12024 memcpy(&new_pos_digits[weightdiff], accum->
pos_digits,
12025 old_ndigits *
sizeof(
int32));
12028 memcpy(&new_neg_digits[weightdiff], accum->
neg_digits,
12029 old_ndigits *
sizeof(
int32));
12036 accum->
weight = accum_weight;
12037 accum->
ndigits = accum_ndigits;
12093 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,...)
#define palloc_object(type)
#define palloc0_object(type)
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
static char buf[DEFAULT_XLOG_SEG_SIZE]
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)