From bd96dd118403c6e05486c1060745956ca2ee4466 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 31 Jan 2003 01:08:08 +0000 Subject: [PATCH] Allow a time zone to be specified (and silently ignored) in the input for type 'time without time zone', as we already did for type 'timestamp without time zone'. This patch was proposed by Tom Lockhart on 7-Nov-02, but he never got around to applying it. Adjust regression tests and documentation to match. --- doc/src/sgml/datatype.sgml | 40 ++++++------------- src/backend/utils/adt/date.c | 5 ++- .../expected/horology-no-DST-before-1970.out | 26 +++++++++--- .../expected/horology-solaris-1947.out | 26 +++++++++--- src/test/regress/expected/horology.out | 26 +++++++++--- src/test/regress/expected/time.out | 9 ++--- src/test/regress/sql/horology.sql | 2 +- src/test/regress/sql/time.sql | 7 ++-- 8 files changed, 86 insertions(+), 55 deletions(-) diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index 9bbd5146c2..4f166e06bc 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -1,5 +1,5 @@ @@ -1488,14 +1488,21 @@ SELECT b, char_length(b) FROM test2; - The time type can be specified as time or - as time without time zone. The optional precision - p should be between 0 and 6, and - defaults to the precision of the input time literal. + The time-of-day types are time [ + (p) ] without time zone and + time [ (p) ] with time + zone. Writing just time is equivalent to + time without time zone. - shows the valid time inputs. + Valid input for these types consists of a time of day followed by an + optional time zone. (See .) + The optional precision + p should be between 0 and 6, and + defaults to the precision of the input time literal. If a time zone + is specified in the input for time without time zone, + it is silently ignored. @@ -1536,27 +1543,6 @@ SELECT b, char_length(b) FROM test2; allballssame as 00:00:00 - - -
- - - The type time with time zone accepts all input also - legal for the time type, appended with a legal time - zone, as shown in . - - - - Time With Time Zone Input - - - - Example - Description - - - 04:05:06.789-8 ISO 8601 diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 90f41ad817..09d0e9aa25 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.77 2003/01/29 01:08:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.78 2003/01/31 01:08:08 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -511,6 +511,7 @@ time_in(PG_FUNCTION_ARGS) fsec_t fsec; struct tm tt, *tm = &tt; + int tz; int nf; char lowstr[MAXDATELEN + 1]; char *field[MAXDATEFIELDS]; @@ -521,7 +522,7 @@ time_in(PG_FUNCTION_ARGS) elog(ERROR, "Bad time external representation (too long) '%s'", str); if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) - || (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, NULL) != 0)) + || (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0)) elog(ERROR, "Bad time external representation '%s'", str); tm2time(tm, fsec, &result); diff --git a/src/test/regress/expected/horology-no-DST-before-1970.out b/src/test/regress/expected/horology-no-DST-before-1970.out index b8b7423ec5..ab40a6404c 100644 --- a/src/test/regress/expected/horology-no-DST-before-1970.out +++ b/src/test/regress/expected/horology-no-DST-before-1970.out @@ -196,15 +196,31 @@ SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; (1 row) SET DateStyle = 'ISO'; --- Reject time without time zone having a time zone specified +-- As of 7.4, allow time without time zone having a time zone specified SELECT time without time zone '040506.789+08'; -ERROR: Bad time external representation '040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone '040506.789-08'; -ERROR: Bad time external representation '040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789+08'; -ERROR: Bad time external representation 'T040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789-08'; -ERROR: Bad time external representation 'T040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time with time zone '040506.789+08'; timetz ------------------ diff --git a/src/test/regress/expected/horology-solaris-1947.out b/src/test/regress/expected/horology-solaris-1947.out index 1601a346f0..222ee30367 100644 --- a/src/test/regress/expected/horology-solaris-1947.out +++ b/src/test/regress/expected/horology-solaris-1947.out @@ -196,15 +196,31 @@ SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; (1 row) SET DateStyle = 'ISO'; --- Reject time without time zone having a time zone specified +-- As of 7.4, allow time without time zone having a time zone specified SELECT time without time zone '040506.789+08'; -ERROR: Bad time external representation '040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone '040506.789-08'; -ERROR: Bad time external representation '040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789+08'; -ERROR: Bad time external representation 'T040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789-08'; -ERROR: Bad time external representation 'T040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time with time zone '040506.789+08'; timetz ------------------ diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index 294b785410..2735641e39 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -196,15 +196,31 @@ SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; (1 row) SET DateStyle = 'ISO'; --- Reject time without time zone having a time zone specified +-- As of 7.4, allow time without time zone having a time zone specified SELECT time without time zone '040506.789+08'; -ERROR: Bad time external representation '040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone '040506.789-08'; -ERROR: Bad time external representation '040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789+08'; -ERROR: Bad time external representation 'T040506.789+08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time without time zone 'T040506.789-08'; -ERROR: Bad time external representation 'T040506.789-08' + time +--------------- + 04:05:06.7890 +(1 row) + SELECT time with time zone '040506.789+08'; timetz ------------------ diff --git a/src/test/regress/expected/time.out b/src/test/regress/expected/time.out index ddefeadc34..e8b2b6de33 100644 --- a/src/test/regress/expected/time.out +++ b/src/test/regress/expected/time.out @@ -4,12 +4,9 @@ CREATE TABLE TIME_TBL (f1 time(2)); INSERT INTO TIME_TBL VALUES ('00:00'); INSERT INTO TIME_TBL VALUES ('01:00'); -INSERT INTO TIME_TBL VALUES ('02:03'); -INSERT INTO TIME_TBL VALUES ('07:07 PST'); -ERROR: Bad time external representation '07:07 PST' -INSERT INTO TIME_TBL VALUES ('08:08 EDT'); -ERROR: Bad time external representation '08:08 EDT' -INSERT INTO TIME_TBL VALUES ('11:59'); +-- as of 7.4, timezone spec should be accepted and ignored +INSERT INTO TIME_TBL VALUES ('02:03 PST'); +INSERT INTO TIME_TBL VALUES ('11:59 EDT'); INSERT INTO TIME_TBL VALUES ('12:00'); INSERT INTO TIME_TBL VALUES ('12:01'); INSERT INTO TIME_TBL VALUES ('23:59'); diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index 6d767d2376..0af769a8b2 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -42,7 +42,7 @@ SET DateStyle = 'German'; SELECT timestamp with time zone '27.12.2001 04:05:06.789+08'; SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; SET DateStyle = 'ISO'; --- Reject time without time zone having a time zone specified +-- As of 7.4, allow time without time zone having a time zone specified SELECT time without time zone '040506.789+08'; SELECT time without time zone '040506.789-08'; SELECT time without time zone 'T040506.789+08'; diff --git a/src/test/regress/sql/time.sql b/src/test/regress/sql/time.sql index 8ab8caa607..510cc14854 100644 --- a/src/test/regress/sql/time.sql +++ b/src/test/regress/sql/time.sql @@ -6,10 +6,9 @@ CREATE TABLE TIME_TBL (f1 time(2)); INSERT INTO TIME_TBL VALUES ('00:00'); INSERT INTO TIME_TBL VALUES ('01:00'); -INSERT INTO TIME_TBL VALUES ('02:03'); -INSERT INTO TIME_TBL VALUES ('07:07 PST'); -INSERT INTO TIME_TBL VALUES ('08:08 EDT'); -INSERT INTO TIME_TBL VALUES ('11:59'); +-- as of 7.4, timezone spec should be accepted and ignored +INSERT INTO TIME_TBL VALUES ('02:03 PST'); +INSERT INTO TIME_TBL VALUES ('11:59 EDT'); INSERT INTO TIME_TBL VALUES ('12:00'); INSERT INTO TIME_TBL VALUES ('12:01'); INSERT INTO TIME_TBL VALUES ('23:59'); -- GitLab