-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
NotDashEscaped: You need GnuPG to verify this message



Here is another attempt at the datetime fix, to stop the ambiguity 
for dates like "01-13-2003". I put the > 12 month validation in because 
otherwise it is still read in as a "month", but it rolls over. 
In other words, '2003-14-03' becomes '2004-02-03'



--
Greg Sabino Mullane [EMAIL PROTECTED]
PGP Key: 0x14964AC8 200306301327





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(MONTH)))
!               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() */




-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html

iD8DBQE/AHNDvJuQZxSWSsgRApuiAKDB5CcBTxwQBnOdRkzPpLCOKHMmNgCeLJ//
Nz5sB+KyQUWv+MEVLXztBJw=
=kXb4
-----END PGP SIGNATURE-----




---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to