diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index b345e0aead..51e1b28242 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -3248,7 +3248,7 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out) case DCH_DY: case DCH_Dy: case DCH_dy: - from_char_seq_search(&value, &s, days, + from_char_seq_search(&value, &s, days_short, n); from_char_set_int(&out->d, value, n); out->d++; @@ -3347,10 +3347,6 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out) SKIP_THth(s, n->suffix); break; case DCH_RM: - from_char_seq_search(&value, &s, rm_months_upper, - n); - from_char_set_int(&out->mm, MONTHS_PER_YEAR - value, n); - break; case DCH_rm: from_char_seq_search(&value, &s, rm_months_lower, n); diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index 58bb215497..bbbe76b4c0 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -2660,6 +2660,18 @@ SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD'); Tue Nov 16 00:00:00 1997 PST BC (1 row) +SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); + to_timestamp +------------------------------ + Sun Nov 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD'); + to_timestamp +--------------------------------- + Tue Nov 16 00:00:00 1997 PST BC +(1 row) + SELECT to_timestamp('9-1116', 'Y-MMDD'); to_timestamp ------------------------------ @@ -2756,6 +2768,18 @@ SELECT to_timestamp('2011-12-18 11:38 PM', 'YYYY-MM-DD HH12:MI PM'); Sun Dec 18 23:38:00 2011 PST (1 row) +SELECT to_timestamp('2011-12-18 11:38 A.M.', 'YYYY-MM-DD HH12:MI P.M.'); + to_timestamp +------------------------------ + Sun Dec 18 11:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 P.M.', 'YYYY-MM-DD HH12:MI P.M.'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:00 2011 PST +(1 row) + SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH'); to_timestamp ------------------------------ @@ -2786,6 +2810,32 @@ SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); Sun Dec 18 03:18:00 2011 PST (1 row) +SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI +ERROR: formatting field "TZ" is only supported in to_char +SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); + to_timestamp +---------------------------------- + Fri Nov 02 12:34:56.025 2018 PDT +(1 row) + +SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored + to_date +------------ + 04-01-1902 +(1 row) + +SELECT to_date('3 4 21 01', 'W MM CC YY'); + to_date +------------ + 04-15-2001 +(1 row) + +SELECT to_date('2458872', 'J'); + to_date +------------ + 01-23-2020 +(1 row) + -- -- Check handling of multiple spaces in format and/or input -- @@ -2950,6 +3000,19 @@ SELECT to_timestamp('19971)24', 'YYYYMMDD'); ERROR: invalid value "1)" for "MM" DETAIL: Field requires 2 characters, but only 1 could be parsed. HINT: If your source string is not fixed-width, try using the "FM" modifier. +-- We don't accept full-length day or month names if short form is specified: +SELECT to_timestamp('Friday 1-January-1999', 'DY DD MON YYYY'); +ERROR: invalid value "da" for "DD" +DETAIL: Value must be an integer. +SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY'); +ERROR: invalid value "uary" for "YYYY" +DETAIL: Value must be an integer. +SELECT to_timestamp('Fri 1-Jan-1999', 'DY DD MON YYYY'); -- ok + to_timestamp +------------------------------ + Fri Jan 01 00:00:00 1999 PST +(1 row) + -- Value clobbering: SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD'); ERROR: conflicting values for "Mon" field in formatting string diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index e356dd563e..90b9a8e90f 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -365,6 +365,9 @@ SELECT to_timestamp('20000-1116', 'YYYY-MMDD'); SELECT to_timestamp('1997 AD 11 16', 'YYYY BC MM DD'); SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD'); +SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); +SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD'); + SELECT to_timestamp('9-1116', 'Y-MMDD'); SELECT to_timestamp('95-1116', 'YY-MMDD'); @@ -396,12 +399,23 @@ SELECT to_timestamp(' 20050302', 'YYYYMMDD'); SELECT to_timestamp('2011-12-18 11:38 AM', 'YYYY-MM-DD HH12:MI PM'); SELECT to_timestamp('2011-12-18 11:38 PM', 'YYYY-MM-DD HH12:MI PM'); +SELECT to_timestamp('2011-12-18 11:38 A.M.', 'YYYY-MM-DD HH12:MI P.M.'); +SELECT to_timestamp('2011-12-18 11:38 P.M.', 'YYYY-MM-DD HH12:MI P.M.'); + SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH'); SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZH'); SELECT to_timestamp('2011-12-18 11:38 +05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); SELECT to_timestamp('2011-12-18 11:38 -05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); +SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI + +SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); + +SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored +SELECT to_date('3 4 21 01', 'W MM CC YY'); +SELECT to_date('2458872', 'J'); + -- -- Check handling of multiple spaces in format and/or input -- @@ -450,6 +464,11 @@ SELECT to_timestamp('19971', 'YYYYMMDD'); -- Insufficient digit characters for a single node: SELECT to_timestamp('19971)24', 'YYYYMMDD'); +-- We don't accept full-length day or month names if short form is specified: +SELECT to_timestamp('Friday 1-January-1999', 'DY DD MON YYYY'); +SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY'); +SELECT to_timestamp('Fri 1-Jan-1999', 'DY DD MON YYYY'); -- ok + -- Value clobbering: SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');