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.
This commit is contained in:
Tom Lane 2003-01-31 01:08:08 +00:00
parent 37b247a5e9
commit bd96dd1184
8 changed files with 86 additions and 55 deletions

View File

@ -1,5 +1,5 @@
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/datatype.sgml,v 1.112 2003/01/29 01:08:42 tgl Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/datatype.sgml,v 1.113 2003/01/31 01:08:07 tgl Exp $
-->
<chapter id="datatype">
@ -1488,14 +1488,21 @@ SELECT b, char_length(b) FROM test2;
</indexterm>
<para>
The <type>time</type> type can be specified as <type>time</type> or
as <type>time without time zone</type>. The optional precision
<replaceable>p</replaceable> should be between 0 and 6, and
defaults to the precision of the input time literal.
The time-of-day types are <type>time [
(<replaceable>p</replaceable>) ] without time zone</type> and
<type>time [ (<replaceable>p</replaceable>) ] with time
zone</type>. Writing just <type>time</type> is equivalent to
<type>time without time zone</type>.
</para>
<para>
<xref linkend="datatype-datetime-time-table"> shows the valid <type>time</type> inputs.
Valid input for these types consists of a time of day followed by an
optional time zone. (See <xref linkend="datatype-datetime-time-table">.)
The optional precision
<replaceable>p</replaceable> 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 <type>time without time zone</type>,
it is silently ignored.
</para>
<table id="datatype-datetime-time-table">
@ -1536,27 +1543,6 @@ SELECT b, char_length(b) FROM test2;
<entry><literal>allballs</literal></entry>
<entry>same as 00:00:00</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
The type <type>time with time zone</type> accepts all input also
legal for the <type>time</type> type, appended with a legal time
zone, as shown in <xref
linkend="datatype-datetime-timetz-table">.
</para>
<table id="datatype-datetime-timetz-table">
<title>Time With Time Zone Input</title>
<tgroup cols="2">
<thead>
<row>
<entry>Example</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>04:05:06.789-8</entry>
<entry>ISO 8601</entry>

View File

@ -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);

View File

@ -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
------------------

View File

@ -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
------------------

View File

@ -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
------------------

View File

@ -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');

View File

@ -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';

View File

@ -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');