Skip to content

Commit fe1b07a

Browse files
committed
When checking for datetime field overflow, we should allow a fractional-second
part that rounds up to exactly 1.0 second. The previous coding rejected input like "00:12:57.9999999999999999999999999999", with the exact number of nines needed to cause failure varying depending on float-timestamp option and possibly on platform. Obviously this should round up to the next integral second, if we don't have enough precision to distinguish the value from that. Per bug #4789 from Robert Kruus. In passing, fix a missed check for fractional seconds in one copy of the "is it greater than 24:00:00" code. Broken all the way back, so patch all the way back.
1 parent cfb61be commit fe1b07a

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

src/backend/utils/adt/datetime.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.203 2009/03/22 01:12:31 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.204 2009/05/01 19:29:07 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -950,7 +950,8 @@ DecodeDateTime(char **field, int *ftype, int nf,
950950
*/
951951
/* test for > 24:00:00 */
952952
if (tm->tm_hour > 24 ||
953-
(tm->tm_hour == 24 && (tm->tm_min > 0 || tm->tm_sec > 0)))
953+
(tm->tm_hour == 24 &&
954+
(tm->tm_min > 0 || tm->tm_sec > 0 || *fsec > 0)))
954955
return DTERR_FIELD_OVERFLOW;
955956
break;
956957

@@ -2058,15 +2059,13 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
20582059

20592060
if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_min > 59 ||
20602061
tm->tm_sec < 0 || tm->tm_sec > 60 || tm->tm_hour > 24 ||
2061-
/* test for > 24:00:00 */
2062+
/* test for > 24:00:00 */
2063+
(tm->tm_hour == 24 &&
2064+
(tm->tm_min > 0 || tm->tm_sec > 0 || *fsec > 0)) ||
20622065
#ifdef HAVE_INT64_TIMESTAMP
2063-
(tm->tm_hour == 24 && (tm->tm_min > 0 || tm->tm_sec > 0 ||
2064-
*fsec > INT64CONST(0))) ||
2065-
*fsec < INT64CONST(0) || *fsec >= USECS_PER_SEC
2066+
*fsec < INT64CONST(0) || *fsec > USECS_PER_SEC
20662067
#else
2067-
(tm->tm_hour == 24 && (tm->tm_min > 0 || tm->tm_sec > 0 ||
2068-
*fsec > 0)) ||
2069-
*fsec < 0 || *fsec >= 1
2068+
*fsec < 0 || *fsec > 1
20702069
#endif
20712070
)
20722071
return DTERR_FIELD_OVERFLOW;
@@ -2386,11 +2385,11 @@ DecodeTime(char *str, int fmask, int range,
23862385
#ifdef HAVE_INT64_TIMESTAMP
23872386
if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_min > 59 ||
23882387
tm->tm_sec < 0 || tm->tm_sec > 60 || *fsec < INT64CONST(0) ||
2389-
*fsec >= USECS_PER_SEC)
2388+
*fsec > USECS_PER_SEC)
23902389
return DTERR_FIELD_OVERFLOW;
23912390
#else
23922391
if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_min > 59 ||
2393-
tm->tm_sec < 0 || tm->tm_sec > 60 || *fsec < 0 || *fsec >= 1)
2392+
tm->tm_sec < 0 || tm->tm_sec > 60 || *fsec < 0 || *fsec > 1)
23942393
return DTERR_FIELD_OVERFLOW;
23952394
#endif
23962395

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy