diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 0e3d3e8c725..e1e05e4df2c 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -3084,7 +3084,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++; @@ -3183,10 +3183,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 b691e307036..dc3a188c51b 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -2822,6 +2822,18 @@ SELECT to_timestamp('20000-1116', 'YYYY-MMDD'); Thu Nov 16 00:00:00 20000 PST (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 ------------------------------ @@ -2906,6 +2918,44 @@ SELECT to_timestamp(' 20050302', 'YYYYMMDD'); Wed Mar 02 00:00:00 2005 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 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI +ERROR: "TZ"/"tz"/"OF" format patterns are not supported in to_date +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 -- @@ -2998,6 +3048,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 "ay" for "DD" +DETAIL: Value must be an integer. +SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY'); +ERROR: invalid value "ary-" 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 472d2af794b..5a278e499b0 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -412,6 +412,9 @@ SELECT to_timestamp('19971116', 'YYYYMMDD'); SELECT to_timestamp('20000-1116', 'YYYY-MMDD'); +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'); @@ -440,6 +443,17 @@ SELECT to_timestamp(' 2005 03 02', 'YYYYMMDD'); SELECT to_timestamp(' 20050302', 'YYYYMMDD'); +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 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 -- @@ -473,6 +487,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');