mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-06 21:59:20 +02:00
Fix an oversight in commit 4c70098ff
.
I had supposed that the from_char_seq_search() call sites were all passing the constant arrays you'd expect them to pass ... but on looking closer, the one for DY format was passing the days[] array not days_short[]. This accidentally worked because the day abbreviations in English are all the same as the first three letters of the full day names. However, once we took out the "maximum comparison length" logic, it stopped working. As penance for that oversight, add regression test cases covering this, as well as every other switch case in DCH_from_char() that was not reached according to the code coverage report. Also, fold the DCH_RM and DCH_rm cases into one --- now that seq_search is case independent, there's no need to pass different comparison arrays for those cases. Back-patch, as the previous commit was.
This commit is contained in:
parent
be13f227fe
commit
f309c812ed
@ -3248,7 +3248,7 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out)
|
|||||||
case DCH_DY:
|
case DCH_DY:
|
||||||
case DCH_Dy:
|
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);
|
n);
|
||||||
from_char_set_int(&out->d, value, n);
|
from_char_set_int(&out->d, value, n);
|
||||||
out->d++;
|
out->d++;
|
||||||
@ -3347,10 +3347,6 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out)
|
|||||||
SKIP_THth(s, n->suffix);
|
SKIP_THth(s, n->suffix);
|
||||||
break;
|
break;
|
||||||
case DCH_RM:
|
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:
|
case DCH_rm:
|
||||||
from_char_seq_search(&value, &s, rm_months_lower,
|
from_char_seq_search(&value, &s, rm_months_lower,
|
||||||
n);
|
n);
|
||||||
|
@ -2660,6 +2660,18 @@ SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD');
|
|||||||
Tue Nov 16 00:00:00 1997 PST BC
|
Tue Nov 16 00:00:00 1997 PST BC
|
||||||
(1 row)
|
(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');
|
SELECT to_timestamp('9-1116', 'Y-MMDD');
|
||||||
to_timestamp
|
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
|
Sun Dec 18 23:38:00 2011 PST
|
||||||
(1 row)
|
(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');
|
SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH');
|
||||||
to_timestamp
|
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
|
Sun Dec 18 03:18:00 2011 PST
|
||||||
(1 row)
|
(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
|
-- 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"
|
ERROR: invalid value "1)" for "MM"
|
||||||
DETAIL: Field requires 2 characters, but only 1 could be parsed.
|
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.
|
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:
|
-- Value clobbering:
|
||||||
SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');
|
SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');
|
||||||
ERROR: conflicting values for "Mon" field in formatting string
|
ERROR: conflicting values for "Mon" field in formatting string
|
||||||
|
@ -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 AD 11 16', 'YYYY BC MM DD');
|
||||||
SELECT to_timestamp('1997 BC 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('9-1116', 'Y-MMDD');
|
||||||
|
|
||||||
SELECT to_timestamp('95-1116', 'YY-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 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 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', '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 -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 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
|
-- 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:
|
-- Insufficient digit characters for a single node:
|
||||||
SELECT to_timestamp('19971)24', 'YYYYMMDD');
|
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:
|
-- Value clobbering:
|
||||||
SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');
|
SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user