diff options
Diffstat (limited to 'src/backend/utils/adt/datetime.c')
-rw-r--r-- | src/backend/utils/adt/datetime.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 178b3f47803..267dfd37b2e 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -3278,6 +3278,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, { bool force_negative = false; bool is_before = false; + bool parsing_unit_val = false; char *cp; int fmask = 0, tmask, @@ -3336,6 +3337,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, itm_in->tm_usec > 0) itm_in->tm_usec = -itm_in->tm_usec; type = DTK_DAY; + parsing_unit_val = false; break; case DTK_TZ: @@ -3373,6 +3375,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, * are reading right to left. */ type = DTK_DAY; + parsing_unit_val = false; break; } @@ -3562,10 +3565,14 @@ DecodeInterval(char **field, int *ftype, int nf, int range, default: return DTERR_BAD_FORMAT; } + parsing_unit_val = false; break; case DTK_STRING: case DTK_SPECIAL: + /* reject consecutive unhandled units */ + if (parsing_unit_val) + return DTERR_BAD_FORMAT; type = DecodeUnits(i, field[i], &uval); if (type == IGNORE_DTF) continue; @@ -3575,6 +3582,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, { case UNITS: type = uval; + parsing_unit_val = true; break; case AGO: @@ -3607,6 +3615,10 @@ DecodeInterval(char **field, int *ftype, int nf, int range, if (fmask == 0) return DTERR_BAD_FORMAT; + /* reject if unit appeared and was never handled */ + if (parsing_unit_val) + return DTERR_BAD_FORMAT; + /* finally, AGO negates everything */ if (is_before) { |