• Tom Lane's avatar
    Fix interval_mul() to not produce insane results. · a898b409
    Tom Lane authored
    interval_mul() attempts to prevent its calculations from producing silly
    results, but it forgot that zero times infinity yields NaN in IEEE
    arithmetic.  Hence, a case like '1 second'::interval * 'infinity'::float8
    produced a NaN for the months product, which didn't trigger the range
    check, resulting in bogus and possibly platform-dependent output.
    
    This isn't terribly obvious to the naked eye because if you try that
    exact case, you get "interval out of range" which is what you expect
    --- but if you look closer, the error is coming from interval_out not
    interval_mul.  interval_mul has allowed a bogus value into the system.
    
    Fix by adding isnan tests.
    
    Noted while testing Vitaly Burovoy's fix for infinity input to
    to_timestamp().  Given the lack of field complaints, I doubt this
    is worth a back-patch.
    a898b409
timestamp.c 137 KB