From 9472024ef0de1056e91c559277fc0deedd7a79e8 Mon Sep 17 00:00:00 2001 From: Joseph Koshakow Date: Sat, 1 Apr 2023 10:22:24 -0400 Subject: [PATCH 1/3] Move integer helper function to int.h --- src/backend/utils/adt/datetime.c | 25 ++++--------------------- src/include/common/int.h | 13 +++++++++++++ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 5d8d583ddc..dc79cbb4db 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -51,7 +51,6 @@ static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, struct pg_tm *tm); static char *AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros); -static bool int64_multiply_add(int64 val, int64 multiplier, int64 *sum); static bool AdjustFractMicroseconds(double frac, int64 scale, struct pg_itm_in *itm_in); static bool AdjustFractDays(double frac, int scale, @@ -515,22 +514,6 @@ AppendTimestampSeconds(char *cp, struct pg_tm *tm, fsec_t fsec) return AppendSeconds(cp, tm->tm_sec, fsec, MAX_TIMESTAMP_PRECISION, true); } - -/* - * Add val * multiplier to *sum. - * Returns true if successful, false on overflow. - */ -static bool -int64_multiply_add(int64 val, int64 multiplier, int64 *sum) -{ - int64 product; - - if (pg_mul_s64_overflow(val, multiplier, &product) || - pg_add_s64_overflow(*sum, product, sum)) - return false; - return true; -} - /* * Multiply frac by scale (to produce microseconds) and add to itm_in->tm_usec. * Returns true if successful, false if itm_in overflows. @@ -621,7 +604,7 @@ AdjustMicroseconds(int64 val, double fval, int64 scale, struct pg_itm_in *itm_in) { /* Handle the integer part */ - if (!int64_multiply_add(val, scale, &itm_in->tm_usec)) + if (pg_mul_add_s64_overflow(val, scale, &itm_in->tm_usec)) return false; /* Handle the float part */ return AdjustFractMicroseconds(fval, scale, itm_in); @@ -2701,9 +2684,9 @@ DecodeTimeForInterval(char *str, int fmask, int range, return dterr; itm_in->tm_usec = itm.tm_usec; - if (!int64_multiply_add(itm.tm_hour, USECS_PER_HOUR, &itm_in->tm_usec) || - !int64_multiply_add(itm.tm_min, USECS_PER_MINUTE, &itm_in->tm_usec) || - !int64_multiply_add(itm.tm_sec, USECS_PER_SEC, &itm_in->tm_usec)) + if (pg_mul_add_s64_overflow(itm.tm_hour, USECS_PER_HOUR, &itm_in->tm_usec) || + pg_mul_add_s64_overflow(itm.tm_min, USECS_PER_MINUTE, &itm_in->tm_usec) || + pg_mul_add_s64_overflow(itm.tm_sec, USECS_PER_SEC, &itm_in->tm_usec)) return DTERR_FIELD_OVERFLOW; return 0; diff --git a/src/include/common/int.h b/src/include/common/int.h index 450800894e..81726c65f7 100644 --- a/src/include/common/int.h +++ b/src/include/common/int.h @@ -254,6 +254,19 @@ pg_mul_s64_overflow(int64 a, int64 b, int64 *result) #endif } +/* + * Add val * multiplier to *sum. + * Returns false if successful, true on overflow. + */ +static inline bool +pg_mul_add_s64_overflow(int64 val, int64 multiplier, int64 *sum) +{ + int64 product; + + return pg_mul_s64_overflow(val, multiplier, &product) || + pg_add_s64_overflow(*sum, product, sum); +} + /*------------------------------------------------------------------------ * Overflow routines for unsigned integers *------------------------------------------------------------------------ -- 2.25.1