Commit 5ddeffb6 authored by Bruce Momjian's avatar Bruce Momjian

Fix AT TIME ZONE for timestamps without time zones:

	test=> select (CURRENT_DATE + '05:00'::time)::timestamp at time zone
	'Canada/Pacific';
	        timezone
	------------------------
	 2005-07-22 08:00:00-04
	(1 row)
parent 26102657
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.142 2005/07/22 21:16:15 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.143 2005/07/23 02:02:27 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3922,10 +3922,14 @@ interval_part(PG_FUNCTION_ARGS) ...@@ -3922,10 +3922,14 @@ interval_part(PG_FUNCTION_ARGS)
} }
/* timestamp_zone() /* timestamp_zone()
* Encode timestamp type with specified time zone. * Encode timestamp type with specified time zone.
* Returns timestamp with time zone, with the input * Returns timestamp with time zone, with the input
* rotated from local time to the specified zone. * rotated from local time to the specified zone.
* This function is tricky because instead of shifting
* the time _to_ a new time zone, it sets the time to _be_
* the specified timezone. This requires trickery
* of double-subtracting the requested timezone offset.
*/ */
Datum Datum
timestamp_zone(PG_FUNCTION_ARGS) timestamp_zone(PG_FUNCTION_ARGS)
...@@ -3960,7 +3964,7 @@ timestamp_zone(PG_FUNCTION_ARGS) ...@@ -3960,7 +3964,7 @@ timestamp_zone(PG_FUNCTION_ARGS)
/* Apply the timezone change */ /* Apply the timezone change */
if (timestamp2tm(timestamp, &tz, &tm, &fsec, NULL, tzp) != 0 || if (timestamp2tm(timestamp, &tz, &tm, &fsec, NULL, tzp) != 0 ||
tm2timestamp(&tm, fsec, NULL, &result) != 0) tm2timestamp(&tm, fsec, &tz, &result) != 0)
{ {
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
...@@ -3968,6 +3972,9 @@ timestamp_zone(PG_FUNCTION_ARGS) ...@@ -3968,6 +3972,9 @@ timestamp_zone(PG_FUNCTION_ARGS)
tzname))); tzname)));
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
/* Must double-adjust for timezone */
result = dt2local(result, -tz);
PG_RETURN_TIMESTAMPTZ(result); PG_RETURN_TIMESTAMPTZ(result);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment