|
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 |
|
|