diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 783c7b5e7a..9e64eec7da 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -3210,14 +3210,14 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col if (!tm->tm_mon) break; sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4, - rm_months_upper[MONTHS_PER_YEAR - tm->tm_mon]); + rm_months_upper[MONTHS_PER_YEAR - Abs(tm->tm_mon)]); s += strlen(s); break; case DCH_rm: if (!tm->tm_mon) break; sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4, - rm_months_lower[MONTHS_PER_YEAR - tm->tm_mon]); + rm_months_lower[MONTHS_PER_YEAR - Abs(tm->tm_mon)]); s += strlen(s); break; case DCH_W: diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index fff3cf08c1..2ef529dd28 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -1816,6 +1816,18 @@ SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') 7 78 789 7890 78901 789012 7 78 789 7890 78901 789012 789 789012 (4 rows) +SELECT to_char(interval '-3mon', 'rm'); + to_char +--------- + iii +(1 row) + +SELECT to_char(interval '-1year -10mon', 'RM'); + to_char +--------- + X +(1 row) + -- timestamp numeric fields constructor SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); make_timestamp diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index ed03d7c218..fddf553e2b 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -306,6 +306,10 @@ SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') ('2018-11-02 12:34:56.78901234') ) d(d); +SELECT to_char(interval '-3mon', 'rm'); + +SELECT to_char(interval '-1year -10mon', 'RM'); + -- timestamp numeric fields constructor SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); SELECT make_timestamp(-44, 3, 15, 12, 30, 15);