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



This one bugged me so much, I made a patch for it. It enforces 
consistent interpretation of date input:

Valid:   YYYY-MM-DD   2003-06-23
Invalid: YYYY-DD-MM   2003-23-06
Valid:   DD-MM-YYYY   23-06-2003
Invalid: MM-DD-YYYY   06-23-2003



Index: datetime.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/datetime.c,v
retrieving revision 1.105
diff -c -r1.105 datetime.c
*** datetime.c  18 May 2003 01:06:26 -0000      1.105
--- datetime.c  23 Jun 2003 20:42:37 -0000
***************
*** 2391,2440 ****
  
                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() */
--- 2391,2442 ----
  
                tm->tm_year = val;
        }
!       /* For ease of reading, break this into "year" and "not-year" */
!       else if ((fmask & DTK_M(YEAR)))
        {
!               /* Have a year and month, must be a day: YYYY-MM-DD */
!               if ((fmask & DTK_M(MONTH))
!                                && ((val >= 1) && (val <= 31)))
!               {
!                       *tmask = DTK_M(DAY);
!                       tm->tm_mday = val;
!               }
!               /* Have a year but no month, must be a month: YYYY-MM-DD */
!               else if ((val >= 1) && (val <= 12))
!               {
!                       *tmask = DTK_M(MONTH);
!                       tm->tm_mon = val;
!               }
!               else
!                       return -1;
        }
!       /* Begin "not year" section */
!       else
        {
!               /* Have no year, no month, and a day, must be a month: DD-MM-YYYY */
!               if ((fmask & DTK_M(DAY)) && (!(fmask & DTK_M(MONTH)))
!                                && ((val >= 1) && (val <= 12)))
!               {
!                       *tmask = DTK_M(MONTH);
!                       tm->tm_mon = val;
!               }
!               /* Have no year and no month, must be day: DD-MM-YYYY */
!               else if ((!(fmask & DTK_M(MONTH)))
!                                && ((val >= 1) && (val <= 31)))
!               {
!                       *tmask = DTK_M(DAY);
!                       tm->tm_mday = val;
!               }
!               /* Have no year, a day, and a month, must be a two digit year: 
DD-MM-YY */
!               else if ((fmask & DTK_M(DAY)) && (fmask & DTK_M(MONTH)))
!               {
!                       *tmask = DTK_M(YEAR);
!                       tm->tm_year = val;
!                       *is2digits = TRUE;
!               }
!               else
!                       return -1;
        }
  
        return 0;
  }     /* DecodeNumber() */




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

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

iD8DBQE+92crvJuQZxSWSsgRAnw+AJwMZnUrMwa61oZ0/ZJE13+gsPHukgCg6Yz1
lSbJJL1X/k0eH3C096DL/Io=
=o3+o
-----END PGP SIGNATURE-----



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

Reply via email to