From: | greg(at)turnstep(dot)com |
---|---|
To: | pgsql-patches(at)postgresql(dot)org |
Subject: | Re: Datetime patch |
Date: | 2003-07-01 13:21:58 |
Message-ID: | 9a2d716b8178bdab757b323a6e406352@biglumber.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers pgsql-patches |
-----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;-----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() */
--
Greg Sabino Mullane greg(at)turnstep(dot)com
PGP Key: 0x14964AC8 200307010916
-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html
iD8DBQE/AYp/vJuQZxSWSsgRAvaLAKCG9si7HhJLOnVIbhPKCo/bP6HMOACfRtlq
DivxA+RBcivkseNS/yvzc/0=
=mris
-----END PGP SIGNATURE-----
! }
return 0;
} /* DecodeNumber() */
--
Greg Sabino Mullane greg(at)turnstep(dot)com
PGP Key: 0x14964AC8 200307010916
-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html
iD8DBQE/AYp/vJuQZxSWSsgRAvaLAKCG9si7HhJLOnVIbhPKCo/bP6HMOACfRtlq
DivxA+RBcivkseNS/yvzc/0=
=mris
-----END PGP SIGNATURE-----
From | Date | Subject | |
---|---|---|---|
Next Message | Rod Taylor | 2003-07-01 13:26:40 | Re: dblink for Oracle - question ... |
Previous Message | Oleg Bartunov | 2003-07-01 13:05:08 | Re: help needed with yacc/bison |
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2003-07-01 13:50:32 | Re: Typo in backend/libpq/be-secure.c |
Previous Message | Shridhar Daithankar | 2003-07-01 09:33:28 | Re: Postgresql.conf, initdb patch |