From 412c57b15fa0b34d5e25ac37a39684b03eeef68a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 25 Aug 2003 22:47:34 +0000 Subject: [PATCH] Allow parsing of time and timetz inputs to accept the documented input syntax '040506' for '04:05:06', as well as '0405' for '04:05:00'. This has been broken since 7.2 but was only recently complained of. --- src/backend/utils/adt/datetime.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index f6bfafa3ce..f463e80bc1 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.113 2003/08/08 21:42:05 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.114 2003/08/25 22:47:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -243,7 +243,7 @@ static datetkn datetktbl[] = { ghst #endif {"gilt", TZ, POS(48)}, /* Gilbert Islands Time */ - {"gmt", TZ, POS(0)}, /* Greenwish Mean Time */ + {"gmt", TZ, POS(0)}, /* Greenwich Mean Time */ {"gst", TZ, POS(40)}, /* Guam Std Time, USSR Zone 9 */ {"gyt", TZ, NEG(16)}, /* Guyana Time */ {"h", UNITS, DTK_HOUR}, /* "hour" */ @@ -1989,7 +1989,8 @@ DecodeTimeOnly(char **field, int *ftype, int nf, * Set the type field to allow decoding other * fields later. Example: 20011223 or 040506 */ - if ((ftype[i] = DecodeNumberField(flen, field[i], fmask, + if ((ftype[i] = DecodeNumberField(flen, field[i], + (fmask | DTK_DATE_M), &tmask, tm, fsec, &is2digits)) < 0) return -1; } @@ -1998,12 +1999,14 @@ DecodeTimeOnly(char **field, int *ftype, int nf, } else if (flen > 4) { - if ((ftype[i] = DecodeNumberField(flen, field[i], fmask, + if ((ftype[i] = DecodeNumberField(flen, field[i], + (fmask | DTK_DATE_M), &tmask, tm, fsec, &is2digits)) < 0) return -1; } /* otherwise it is a single date/time field... */ - else if (DecodeNumber(flen, field[i], fmask, + else if (DecodeNumber(flen, field[i], + (fmask | DTK_DATE_M), &tmask, tm, fsec, &is2digits) != 0) return -1; } @@ -2422,8 +2425,12 @@ DecodeNumber(int flen, char *str, int fmask, * or a run-together time: 2001.360 20011225 040506.789 */ if ((cp - str) > 2) - return DecodeNumberField(flen, str, (fmask | DTK_DATE_M), - tmask, tm, fsec, is2digits); + { + if (DecodeNumberField(flen, str, (fmask | DTK_DATE_M), + tmask, tm, fsec, is2digits) < 0) + return -1; + return 0; + } frac = strtod(cp, &cp); if (*cp != '\0') @@ -2507,6 +2514,13 @@ DecodeNumber(int flen, char *str, int fmask, tm->tm_mday = val; break; + case (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY)): + /* we have all the date, so it must be a time field */ + if (DecodeNumberField(flen, str, fmask, + tmask, tm, fsec, is2digits) < 0) + return -1; + return 0; + default: /* Anything else is bogus input */ return -1;