diff options
-rw-r--r-- | src/backend/utils/adt/formatting.c | 18 | ||||
-rw-r--r-- | src/test/regress/expected/horology.out | 75 | ||||
-rw-r--r-- | src/test/regress/sql/horology.sql | 20 |
3 files changed, 107 insertions, 6 deletions
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 27aea9cbbcb..2099ad0c302 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -2839,16 +2839,22 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out) { if (n->type != NODE_TYPE_ACTION) { + /* + * Separator, so consume one character from input string. Notice + * we don't insist that the consumed character match the format's + * character. + */ s++; - /* Ignore spaces when not in FX (fixed width) mode */ - if (isspace((unsigned char) n->character) && !fx_mode) - { - while (*s != '\0' && isspace((unsigned char) *s)) - s++; - } continue; } + /* Ignore spaces before fields when not in FX (fixed width) mode */ + if (!fx_mode && n->key->id != DCH_FX) + { + while (*s != '\0' && isspace((unsigned char) *s)) + s++; + } + from_char_set_mode(out, n->key->date_mode); switch (n->key->id) diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index 87a695144ea..1fe02be093f 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -2907,6 +2907,81 @@ SELECT to_timestamp(' 20050302', 'YYYYMMDD'); (1 row) -- +-- Check handling of multiple spaces in format and/or input +-- +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 03:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 03:38:15 2011 PST +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-08-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 02-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +-- -- Check errors for some incorrect usages of to_timestamp() -- -- Mixture of date conventions (ISO week and Gregorian): diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index fe9a520cb91..c81437ba358 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -441,6 +441,26 @@ SELECT to_timestamp(' 2005 03 02', 'YYYYMMDD'); SELECT to_timestamp(' 20050302', 'YYYYMMDD'); -- +-- Check handling of multiple spaces in format and/or input +-- + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); + +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); + +-- -- Check errors for some incorrect usages of to_timestamp() -- |