[COMMITTERS] pgsql: Fix interval_transform so it doesn't throw away non-no-opcasts. - Mailing list pgsql-committers

From Tom Lane
Subject [COMMITTERS] pgsql: Fix interval_transform so it doesn't throw away non-no-opcasts.
Date
Msg-id E1cLyba-0005B8-Qo@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
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

Branch
------
REL9_4_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/0b947b692c5e6ef3c20a6b24cad5a3b29f3210f1

Modified Files
--------------
src/backend/utils/adt/timestamp.c      | 111 ++++++++++++++++++++++++---------
src/test/regress/expected/interval.out |  18 ++++++
src/test/regress/sql/interval.sql      |   5 ++
3 files changed, 105 insertions(+), 29 deletions(-)


pgsql-committers by date:

Previous
From: Andrew Dunstan
Date:
Subject: [COMMITTERS] pgsql: Explain unaccounted for space in pgstattuple.
Next
From: Peter Eisentraut
Date:
Subject: [COMMITTERS] pgsql: Make more use of RoleSpec struct