Index: datetime.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/datetime.c,v retrieving revision 1.106 diff -c -r1.106 datetime.c *** datetime.c 25 Jun 2003 21:14:14 -0000 1.106 --- datetime.c 30 Jun 2003 17:26:22 -0000 *************** *** 2379,2440 **** ***/ else if (flen >= 4) { ! *tmask = DTK_M(YEAR); ! /* already have a year? then see if we can substitute... */ ! if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(DAY))) ! && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) { ! tm->tm_mday = tm->tm_year; ! *tmask = DTK_M(DAY); } ! ! tm->tm_year = val; } ! ! /* already have year? then could be month */ ! else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH))) ! && ((val >= 1) && (val <= 12))) { ! *tmask = DTK_M(MONTH); ! tm->tm_mon = val; } ! /* no year and EuroDates enabled? then could be day */ ! else if ((EuroDates || (fmask & DTK_M(MONTH))) ! && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY))) ! && ((val >= 1) && (val <= 31))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! else if ((!(fmask & DTK_M(MONTH))) ! && ((val >= 1) && (val <= 12))) { *tmask = DTK_M(MONTH); tm->tm_mon = val; } ! else if ((!(fmask & DTK_M(DAY))) ! && ((val >= 1) && (val <= 31))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! ! /* ! * Check for 2 or 4 or more digits, but currently we reach here only ! * if two digits. - thomas 2000-03-28 ! */ ! else if (!(fmask & DTK_M(YEAR)) ! && ((flen >= 4) || (flen == 2))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; ! ! /* adjust ONLY if exactly two digits... */ ! *is2digits = (flen == 2); } else ! return -1; return 0; } /* DecodeNumber() */ --- 2379,2447 ---- ***/ else if (flen >= 4) { ! /* ! * If no month or day, start of YYYY-MM-DD ! * If have month AND day, end of MM-DD-YYYY or DD-MM-YYYY ! * If neither case, throw an error ! */ ! if ((!(fmask & DTK_M(YEAR))) ! && (((!(fmask & DTK_M(DAY))) && (!(fmask & DTK_M(MONTH)))) ! || ! ((fmask & DTK_M(DAY)) && (fmask & DTK_M(MONTH))))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; } ! else ! return -1; } ! /* If we already have a day AND month, must be a 2-digit year */ ! else if ((fmask & DTK_M(DAY)) && (fmask & DTK_M(MONTH))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; ! *is2digits = TRUE; } ! ! /* If we already have a year and a month, must be day */ ! else if ((fmask & DTK_M(YEAR)) && (fmask & DTK_M(MONTH))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! /* A year and a day is currently an error, as YYYY-DD-MM is not allowed */ ! else if ((fmask & DTK_M(YEAR)) && (fmask & DTK_M(DAY))) ! return -1; ! /* If have year or day, set the month */ ! else if ((fmask & DTK_M(YEAR)) || (fmask & DTK_M(DAY))) { + /* Do not allow month to roll over */ + if (val > 12) + return -1; *tmask = DTK_M(MONTH); tm->tm_mon = val; } ! /* If have a month, set the day */ ! else if ((fmask & DTK_M(MONTH))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! /* If using EuroDates, this must be the day, otherwise month */ ! else if (EuroDates) { ! *tmask = DTK_M(DAY); ! tm->tm_mday = val; } else ! { ! /* Do not allow month to roll over */ ! if (val > 12) ! return -1; ! *tmask = DTK_M(MONTH); ! tm->tm_mon = val;-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 NotDashEscaped: You need GnuPG to verify this message > I believe this conditional is incorrect. The second part should be DTK_M(DAY). Thank you - that is correct. Revised patch below. Index: datetime.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/datetime.c,v retrieving revision 1.106 diff -c -r1.106 datetime.c *** datetime.c 25 Jun 2003 21:14:14 -0000 1.106 --- datetime.c 30 Jun 2003 17:26:22 -0000 *************** *** 2379,2440 **** ***/ else if (flen >= 4) { ! *tmask = DTK_M(YEAR); ! /* already have a year? then see if we can substitute... */ ! if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(DAY))) ! && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) { ! tm->tm_mday = tm->tm_year; ! *tmask = DTK_M(DAY); } ! ! tm->tm_year = val; } ! ! /* already have year? then could be month */ ! else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH))) ! && ((val >= 1) && (val <= 12))) { ! *tmask = DTK_M(MONTH); ! tm->tm_mon = val; } ! /* no year and EuroDates enabled? then could be day */ ! else if ((EuroDates || (fmask & DTK_M(MONTH))) ! && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY))) ! && ((val >= 1) && (val <= 31))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! else if ((!(fmask & DTK_M(MONTH))) ! && ((val >= 1) && (val <= 12))) { *tmask = DTK_M(MONTH); tm->tm_mon = val; } ! else if ((!(fmask & DTK_M(DAY))) ! && ((val >= 1) && (val <= 31))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! ! /* ! * Check for 2 or 4 or more digits, but currently we reach here only ! * if two digits. - thomas 2000-03-28 ! */ ! else if (!(fmask & DTK_M(YEAR)) ! && ((flen >= 4) || (flen == 2))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; ! ! /* adjust ONLY if exactly two digits... */ ! *is2digits = (flen == 2); } else ! return -1; return 0; } /* DecodeNumber() */ --- 2379,2447 ---- ***/ else if (flen >= 4) { ! /* ! * If no month or day, start of YYYY-MM-DD ! * If have month AND day, end of MM-DD-YYYY or DD-MM-YYYY ! * If neither case, throw an error ! */ ! if ((!(fmask & DTK_M(YEAR))) ! && (((!(fmask & DTK_M(DAY))) && (!(fmask & DTK_M(MONTH)))) ! || ! ((fmask & DTK_M(DAY)) && (fmask & DTK_M(MONTH))))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; } ! else ! return -1; } ! /* If we already have a day AND month, must be a 2-digit year */ ! else if ((fmask & DTK_M(DAY)) && (fmask & DTK_M(MONTH))) { ! *tmask = DTK_M(YEAR); ! tm->tm_year = val; ! *is2digits = TRUE; } ! ! /* If we already have a year and a month, must be day */ ! else if ((fmask & DTK_M(YEAR)) && (fmask & DTK_M(MONTH))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! /* A year and a day is currently an error, as YYYY-DD-MM is not allowed */ ! else if ((fmask & DTK_M(YEAR)) && (fmask & DTK_M(DAY))) ! return -1; ! /* If have year or day, set the month */ ! else if ((fmask & DTK_M(YEAR)) || (fmask & DTK_M(DAY))) { + /* Do not allow month to roll over */ + if (val > 12) + return -1; *tmask = DTK_M(MONTH); tm->tm_mon = val; } ! /* If have a month, set the day */ ! else if ((fmask & DTK_M(MONTH))) { *tmask = DTK_M(DAY); tm->tm_mday = val; } ! /* If using EuroDates, this must be the day, otherwise month */ ! else if (EuroDates) { ! *tmask = DTK_M(DAY); ! tm->tm_mday = val; } else ! { ! /* Do not allow month to roll over */ ! if (val > 12) ! return -1; ! *tmask = DTK_M(MONTH); ! tm->tm_mon = val; ! } return 0; } /* DecodeNumber() */