Commit 66565885 authored by Robert Haas's avatar Robert Haas

Improve interval_transform function to detect a few more cases.

Noah Misch, per a review comment from me.
parent d7ea9193
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment