Improve interval_transform function to detect a few more cases.
Noah Misch, per a review comment from me.
This commit is contained in:
parent
d7ea9193d1
commit
6656588575
@ -958,6 +958,7 @@ interval_transform(PG_FUNCTION_ARGS)
|
|||||||
int new_range = INTERVAL_RANGE(new_typmod);
|
int new_range = INTERVAL_RANGE(new_typmod);
|
||||||
int new_precis = INTERVAL_PRECISION(new_typmod);
|
int new_precis = INTERVAL_PRECISION(new_typmod);
|
||||||
int new_range_fls;
|
int new_range_fls;
|
||||||
|
int old_range_fls;
|
||||||
|
|
||||||
if (old_typmod == -1)
|
if (old_typmod == -1)
|
||||||
{
|
{
|
||||||
@ -974,12 +975,16 @@ interval_transform(PG_FUNCTION_ARGS)
|
|||||||
* Temporally-smaller fields occupy higher positions in the range
|
* Temporally-smaller fields occupy higher positions in the range
|
||||||
* bitmap. Since only the temporally-smallest bit matters for length
|
* bitmap. Since only the temporally-smallest bit matters for length
|
||||||
* coercion purposes, we compare the last-set bits in the ranges.
|
* 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);
|
new_range_fls = fls(new_range);
|
||||||
|
old_range_fls = fls(old_range);
|
||||||
if (new_typmod == -1 ||
|
if (new_typmod == -1 ||
|
||||||
((new_range_fls >= SECOND ||
|
((new_range_fls >= SECOND ||
|
||||||
new_range_fls >= fls(old_range)) &&
|
new_range_fls >= old_range_fls) &&
|
||||||
(new_precis >= MAX_INTERVAL_PRECISION ||
|
(old_range_fls < SECOND ||
|
||||||
|
new_precis >= MAX_INTERVAL_PRECISION ||
|
||||||
new_precis >= old_precis)))
|
new_precis >= old_precis)))
|
||||||
ret = relabel_to_typmod(source, new_typmod);
|
ret = relabel_to_typmod(source, new_typmod);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user