|
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 | static const KeyWord DCH_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 | int j0; /* 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 |
| - int ysum[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 | + const int *y; |
| 3301 | + int i; |
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 | + static const int ysum[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 |
|
|
0 commit comments