diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-12-27 15:43:54 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-12-27 15:43:54 -0500 |
commit | 0b947b692c5e6ef3c20a6b24cad5a3b29f3210f1 (patch) | |
tree | ceaca460c89e82a609f108e758ea228408269260 /src/backend/utils/adt/tsvector_parser.c | |
parent | 99ae68da22df7bc22e83ae8901e16ec14c9dd837 (diff) | |
download | postgresql-0b947b692c5e6ef3c20a6b24cad5a3b29f3210f1.tar.gz postgresql-0b947b692c5e6ef3c20a6b24cad5a3b29f3210f1.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/tsvector_parser.c')
0 files changed, 0 insertions, 0 deletions