aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/arrayfuncs.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-12-27 15:43:54 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2016-12-27 15:43:54 -0500
commit4efe7aa2d8df98dc56d74042b25abf77b4e5bb61 (patch)
tree4de37274f62183ed48e37dc41f90f565a7744453 /src/backend/utils/adt/arrayfuncs.c
parent29e28134fa47ea6041dd89a1f7c0d34b6d0fc136 (diff)
downloadpostgresql-4efe7aa2d8df98dc56d74042b25abf77b4e5bb61.tar.gz
postgresql-4efe7aa2d8df98dc56d74042b25abf77b4e5bb61.zip
Fix interval_transform so it doesn't throw away non-no-op casts.
interval_transform() contained two separate bugs that caused it to sometimes mistakenly decide that a cast from interval to restricted interval is a no-op and throw it away. First, it was wrong to rely on dt.h's field type macros to have an ordering consistent with the field's significance; in one case they do not. This led to mistakenly treating YEAR as less significant than MONTH, so that a cast from INTERVAL MONTH to INTERVAL YEAR was incorrectly discarded. Second, fls(1<<k) produces k+1 not k, so comparing its output directly to SECOND was wrong. This led to supposing that a cast to INTERVAL MINUTE was really a cast to INTERVAL SECOND and so could be discarded. To fix, get rid of the use of fls(), and make a function based on intervaltypmodout to produce a field ID code adapted to the need here. Per bug #14479 from Piotr Stefaniak. Back-patch to 9.2 where transform functions were introduced, because this code was born broken. Discussion: https://postgr.es/m/20161227172307.10135.7747@wrigleys.postgresql.org
Diffstat (limited to 'src/backend/utils/adt/arrayfuncs.c')
0 files changed, 0 insertions, 0 deletions