From: Robert Haas Date: Thu, 9 Feb 2012 17:21:57 +0000 (-0500) Subject: Improve interval_transform function to detect a few more cases. X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js%3Cscript%20data-cfasync=?a=commitdiff_plain;h=6656588575abd13016989be1a276b1b60be49b69;p=users%2Frhaas%2Fpostgres.git Improve interval_transform function to detect a few more cases. Noah Misch, per a review comment from me. --- diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 44a3a922ec..12af7f69f6 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -958,6 +958,7 @@ interval_transform(PG_FUNCTION_ARGS) int new_range = INTERVAL_RANGE(new_typmod); int new_precis = INTERVAL_PRECISION(new_typmod); int new_range_fls; + int old_range_fls; if (old_typmod == -1) { @@ -974,12 +975,16 @@ interval_transform(PG_FUNCTION_ARGS) * Temporally-smaller fields occupy higher positions in the range * bitmap. Since only the temporally-smallest bit matters for length * coercion purposes, we compare the last-set bits in the ranges. + * Precision, which is to say, sub-second precision, only affects + * ranges that include SECOND. */ new_range_fls = fls(new_range); + old_range_fls = fls(old_range); if (new_typmod == -1 || ((new_range_fls >= SECOND || - new_range_fls >= fls(old_range)) && - (new_precis >= MAX_INTERVAL_PRECISION || + new_range_fls >= old_range_fls) && + (old_range_fls < SECOND || + new_precis >= MAX_INTERVAL_PRECISION || new_precis >= old_precis))) ret = relabel_to_typmod(source, new_typmod); }