diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index a8609e8f78..1e7a176c60 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -169,9 +169,10 @@ struct NumericData * otherwise, we want the long one. Instead of testing against each value, we * can just look at the high bit, for a slight efficiency gain. */ +#define NUMERIC_HEADER_IS_SHORT(n) (((n)->choice.n_header & 0x8000) != 0) #define NUMERIC_HEADER_SIZE(n) \ (VARHDRSZ + sizeof(uint16) + \ - (((NUMERIC_FLAGBITS(n) & 0x8000) == 0) ? sizeof(int16) : 0)) + (NUMERIC_HEADER_IS_SHORT(n) ? 0 : sizeof(int16))) /* * Short format definitions. @@ -197,11 +198,11 @@ struct NumericData (NUMERIC_IS_SHORT(n) ? \ (((n)->choice.n_short.n_header & NUMERIC_SHORT_SIGN_MASK) ? \ NUMERIC_NEG : NUMERIC_POS) : NUMERIC_FLAGBITS(n)) -#define NUMERIC_DSCALE(n) (NUMERIC_IS_SHORT((n)) ? \ +#define NUMERIC_DSCALE(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \ ((n)->choice.n_short.n_header & NUMERIC_SHORT_DSCALE_MASK) \ >> NUMERIC_SHORT_DSCALE_SHIFT \ : ((n)->choice.n_long.n_sign_dscale & NUMERIC_DSCALE_MASK)) -#define NUMERIC_WEIGHT(n) (NUMERIC_IS_SHORT((n)) ? \ +#define NUMERIC_WEIGHT(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \ (((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_SIGN_MASK ? \ ~NUMERIC_SHORT_WEIGHT_MASK : 0) \ | ((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_MASK)) \ @@ -374,7 +375,7 @@ static void dump_var(const char *str, NumericVar *var); #define init_var(v) MemSetAligned(v, 0, sizeof(NumericVar)) -#define NUMERIC_DIGITS(num) (NUMERIC_IS_SHORT(num) ? \ +#define NUMERIC_DIGITS(num) (NUMERIC_HEADER_IS_SHORT(num) ? \ (num)->choice.n_short.n_data : (num)->choice.n_long.n_data) #define NUMERIC_NDIGITS(num) \ ((VARSIZE(num) - NUMERIC_HEADER_SIZE(num)) / sizeof(NumericDigit))