|
1 | 1 | /* -----------------------------------------------------------------------
|
2 | 2 | * formatting.c
|
3 | 3 | *
|
4 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.155 2009/03/12 00:53:25 tgl Exp $ |
| 4 | + * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.156 2009/03/15 20:31:19 tgl Exp $ |
5 | 5 | *
|
6 | 6 | *
|
7 | 7 | * Portions Copyright (c) 1999-2009, PostgreSQL Global Development Group
|
@@ -709,13 +709,13 @@ typedef enum
|
709 | 709 | */
|
710 | 710 | staticconstKeyWordDCH_keywords[]= {
|
711 | 711 | /*name, len, id, is_digit, date_mode */
|
712 |
| -{"A.D.",4,DCH_A_D, FALSE,FROM_CHAR_DATE_GREGORIAN},/* A */ |
| 712 | +{"A.D.",4,DCH_A_D, FALSE,FROM_CHAR_DATE_NONE},/* A */ |
713 | 713 | {"A.M.",4,DCH_A_M, FALSE,FROM_CHAR_DATE_NONE},
|
714 |
| -{"AD",2,DCH_AD, FALSE,FROM_CHAR_DATE_GREGORIAN}, |
| 714 | +{"AD",2,DCH_AD, FALSE,FROM_CHAR_DATE_NONE}, |
715 | 715 | {"AM",2,DCH_AM, FALSE,FROM_CHAR_DATE_NONE},
|
716 |
| -{"B.C.",4,DCH_B_C, FALSE,FROM_CHAR_DATE_GREGORIAN},/* B */ |
717 |
| -{"BC",2,DCH_BC, FALSE,FROM_CHAR_DATE_GREGORIAN}, |
718 |
| -{"CC",2,DCH_CC, TRUE,FROM_CHAR_DATE_GREGORIAN},/* C */ |
| 716 | +{"B.C.",4,DCH_B_C, FALSE,FROM_CHAR_DATE_NONE},/* B */ |
| 717 | +{"BC",2,DCH_BC, FALSE,FROM_CHAR_DATE_NONE}, |
| 718 | +{"CC",2,DCH_CC, TRUE,FROM_CHAR_DATE_NONE},/* C */ |
719 | 719 | {"DAY",3,DCH_DAY, FALSE,FROM_CHAR_DATE_NONE},/* D */
|
720 | 720 | {"DDD",3,DCH_DDD, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
721 | 721 | {"DD",2,DCH_DD, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
@@ -757,13 +757,13 @@ static const KeyWord DCH_keywords[] = {
|
757 | 757 | {"YYY",3,DCH_YYY, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
758 | 758 | {"YY",2,DCH_YY, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
759 | 759 | {"Y",1,DCH_Y, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
760 |
| -{"a.d.",4,DCH_a_d, FALSE,FROM_CHAR_DATE_GREGORIAN},/* a */ |
| 760 | +{"a.d.",4,DCH_a_d, FALSE,FROM_CHAR_DATE_NONE},/* a */ |
761 | 761 | {"a.m.",4,DCH_a_m, FALSE,FROM_CHAR_DATE_NONE},
|
762 |
| -{"ad",2,DCH_ad, FALSE,FROM_CHAR_DATE_GREGORIAN}, |
| 762 | +{"ad",2,DCH_ad, FALSE,FROM_CHAR_DATE_NONE}, |
763 | 763 | {"am",2,DCH_am, FALSE,FROM_CHAR_DATE_NONE},
|
764 |
| -{"b.c.",4,DCH_b_c, FALSE,FROM_CHAR_DATE_GREGORIAN},/* b */ |
765 |
| -{"bc",2,DCH_bc, FALSE,FROM_CHAR_DATE_GREGORIAN}, |
766 |
| -{"cc",2,DCH_CC, TRUE,FROM_CHAR_DATE_GREGORIAN},/* c */ |
| 764 | +{"b.c.",4,DCH_b_c, FALSE,FROM_CHAR_DATE_NONE},/* b */ |
| 765 | +{"bc",2,DCH_bc, FALSE,FROM_CHAR_DATE_NONE}, |
| 766 | +{"cc",2,DCH_CC, TRUE,FROM_CHAR_DATE_NONE},/* c */ |
767 | 767 | {"day",3,DCH_day, FALSE,FROM_CHAR_DATE_NONE},/* d */
|
768 | 768 | {"ddd",3,DCH_DDD, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
769 | 769 | {"dd",2,DCH_DD, TRUE,FROM_CHAR_DATE_GREGORIAN},
|
@@ -3281,41 +3281,41 @@ do_to_timestamp(text *date_txt, text *fmt,
|
3281 | 3281 | * be interpreted as a Gregorian day-of-year, or an ISO week date
|
3282 | 3282 | * day-of-year.
|
3283 | 3283 | */
|
| 3284 | + |
| 3285 | +if (!tm->tm_year&& !tmfc.bc) |
| 3286 | +ereport(ERROR, |
| 3287 | +(errcode(ERRCODE_INVALID_DATETIME_FORMAT), |
| 3288 | +errmsg("cannot calculate day of year without year information"))); |
| 3289 | + |
3284 | 3290 | if (tmfc.mode==FROM_CHAR_DATE_ISOWEEK)
|
3285 | 3291 | {
|
3286 | 3292 | intj0;/* zeroth day of the ISO year, in Julian */
|
3287 | 3293 |
|
3288 |
| -j0=isoweek2j(tmfc.year,1)-1; |
| 3294 | +j0=isoweek2j(tm->tm_year,1)-1; |
3289 | 3295 |
|
3290 | 3296 | j2date(j0+tmfc.ddd,&tm->tm_year,&tm->tm_mon,&tm->tm_mday);
|
3291 | 3297 | }
|
3292 | 3298 | else
|
3293 | 3299 | {
|
3294 |
| -int*y, |
3295 |
| -i; |
3296 |
| - |
3297 |
| -intysum[2][13]= { |
3298 |
| -{31,59,90,120,151,181,212,243,273,304,334,365,0}, |
3299 |
| -{31,60,91,121,152,182,213,244,274,305,335,366,0}}; |
| 3300 | +constint*y; |
| 3301 | +inti; |
3300 | 3302 |
|
3301 |
| -if (!tm->tm_year) |
3302 |
| -ereport(ERROR, |
3303 |
| -(errcode(ERRCODE_INVALID_DATETIME_FORMAT), |
3304 |
| -errmsg("cannot calculate day of year without year information"))); |
| 3303 | +staticconstintysum[2][13]= { |
| 3304 | +{0,31,59,90,120,151,181,212,243,273,304,334,365}, |
| 3305 | +{0,31,60,91,121,152,182,213,244,274,305,335,366}}; |
3305 | 3306 |
|
3306 | 3307 | y=ysum[isleap(tm->tm_year)];
|
3307 | 3308 |
|
3308 |
| -for (i=0;i <=11;i++) |
| 3309 | +for (i=1;i <=12;i++) |
3309 | 3310 | {
|
3310 |
| -if (tm->tm_yday<y[i]) |
| 3311 | +if (tmfc.ddd<y[i]) |
3311 | 3312 | break;
|
3312 | 3313 | }
|
3313 | 3314 | if (tm->tm_mon <=1)
|
3314 |
| -tm->tm_mon=i+1; |
| 3315 | +tm->tm_mon=i; |
3315 | 3316 |
|
3316 | 3317 | if (tm->tm_mday <=1)
|
3317 |
| -tm->tm_mday=i==0 ?tm->tm_yday : |
3318 |
| -tm->tm_yday-y[i-1]; |
| 3318 | +tm->tm_mday=tmfc.ddd-y[i-1]; |
3319 | 3319 | }
|
3320 | 3320 | }
|
3321 | 3321 |
|
|