I looked into bug #14504,
The problem is that timestamp_zone_transform() has the cute idea that
it can simplify timezone('UTC', timestamptzvalue) into a RelabelType
that claims the timestamptzvalue is just type timestamp. Well, that's
just too cute, because it confuses the index machinery completely.
What _bt_first() sees is an equality comparison between an index
column that it knows is timestamptz, and a RHS constant that it knows
is timestamp, so it selects timestamptz_cmp_timestamp() as the
comparison function to use. And that function will apply a timezone
rotation, resulting in the wrong answers.
You could blame this on the fact that the planner will ignore the
RelabelType when trying to match the qual to indexes. But that hack has
fifteen years' seniority on this one, and removing it would break (at
least) use of indexes on varchar columns, so I'm not planning on fixing
this that way. I think the only realistic fix is to disable this
optimization in timestamp_zone_transform; certainly that's the only way
I'd be comfortable with back-patching.
(Another reason for being unhappy about this optimization is that EXPLAIN
will print the resulting expression tree as timestamptzvalue::timestamp,
which is a completely misleading description; an actual cast like that
would not behave this way.)
More generally, this is the second serious bug we've found in the last
month in the "transform" optimizations (see also bug #14479 and commit
f0774abde). I'm starting to get the feeling that that idea was an
attractive nuisance --- at the very least, it would behoove us to go
through all the transform functions with a gimlet eye.
regards, tom lane
pgsql-hackers by date
|Next:||From: Euler Taveira||Date: 2017-01-18 17:16:48|
|Subject: Re: pgsql: Add function to import operating system
|Previous:||From: Karl O. Pinc||Date: 2017-01-18 17:08:23|
|Subject: Re: Patch to implement pg_current_logfile() function|