aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/timestamp.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-04-10 12:04:42 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-04-10 12:04:42 -0400
commit0d9819f7e3be3c4186f0398d007d2fef8809da6a (patch)
tree5310eb1acea93bd00fe3516985df38cfdb921636 /src/backend/utils/adt/timestamp.c
parent442da68f73e679ae8a799c249e3bf1fc1a3ee28d (diff)
downloadpostgresql-0d9819f7e3be3c4186f0398d007d2fef8809da6a.tar.gz
postgresql-0d9819f7e3be3c4186f0398d007d2fef8809da6a.zip
Measure epoch of timestamp-without-time-zone from local not UTC midnight.
This patch reverts commit 191ef2b407f065544ceed5700e42400857d9270f and thereby restores the pre-7.3 behavior of EXTRACT(EPOCH FROM timestamp-without-tz). Per discussion, the more recent behavior was misguided on a couple of grounds: it makes it hard to get a non-timezone-aware epoch value for a timestamp, and it makes this one case dependent on the value of the timezone GUC, which is incompatible with having timestamp_part() labeled as immutable. The other behavior is still available (in all releases) by explicitly casting the timestamp to timestamp with time zone before applying EXTRACT. This will need to be called out as an incompatible change in the 9.2 release notes. Although having mutable behavior in a function marked immutable is clearly a bug, we're not going to back-patch such a change.
Diffstat (limited to 'src/backend/utils/adt/timestamp.c')
-rw-r--r--src/backend/utils/adt/timestamp.c25
1 files changed, 3 insertions, 22 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 9a7238be38d..a3e1e94a2b2 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -4066,32 +4066,13 @@ timestamp_part(PG_FUNCTION_ARGS)
switch (val)
{
case DTK_EPOCH:
- {
- int tz;
- TimestampTz timestamptz;
-
- /*
- * convert to timestamptz to produce consistent results
- */
- if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
- ereport(ERROR,
- (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("timestamp out of range")));
-
- tz = DetermineTimeZoneOffset(tm, session_timezone);
-
- if (tm2timestamp(tm, fsec, &tz, &timestamptz) != 0)
- ereport(ERROR,
- (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("timestamp out of range")));
-
#ifdef HAVE_INT64_TIMESTAMP
- result = (timestamptz - SetEpochTimestamp()) / 1000000.0;
+ result = (timestamp - SetEpochTimestamp()) / 1000000.0;
#else
- result = timestamptz - SetEpochTimestamp();
+ result = timestamp - SetEpochTimestamp();
#endif
break;
- }
+
case DTK_DOW:
case DTK_ISODOW:
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)