diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index dc76b055e2..3431a063cc 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.109 2006/04/19 14:48:06 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.110 2006/04/19 18:49:09 momjian Exp $ * * * Portions Copyright (c) 1999-2006, PostgreSQL Global Development Group @@ -917,6 +917,7 @@ static void dump_node(FormatNode *node, int max); static char *get_th(char *num, int type); static char *str_numth(char *dest, char *num, int type); +static int strspace_len(char *str); static int strdigits_len(char *str); static char *str_toupper(char *buff); static char *str_tolower(char *buff); @@ -1686,12 +1687,28 @@ is_next_separator(FormatNode *n) return TRUE; /* some non-digit input (separator) */ } +static int +strspace_len(char *str) +{ + int len = 0; + + while (*str && isspace((unsigned char) *str)) + { + str++; + len++; + } + return len; +} + static int strdigits_len(char *str) { char *p = str; - int len = 0; + int len; + len = strspace_len(str); + p += len; + while (*p && isdigit((unsigned char) *p) && len <= DCH_MAX_ITEM_SIZ) { len++; @@ -1826,7 +1843,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->hh); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -1848,7 +1865,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->hh); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -1870,7 +1887,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->mi); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -1892,7 +1909,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->ss); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -1998,7 +2015,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%05d", &tmfc->ssss); - return 5 + SKIP_THth(suf); + return strspace_len(inout) + 5 + SKIP_THth(suf); } } break; @@ -2249,7 +2266,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->mm); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -2323,7 +2340,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%03d", &tmfc->ddd); - return 3 + SKIP_THth(suf); + return strspace_len(inout) + 3 + SKIP_THth(suf); } } break; @@ -2345,7 +2362,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->dd); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -2360,7 +2377,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%1d", &tmfc->d); - return 1 + SKIP_THth(suf); + return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_WW: @@ -2382,7 +2399,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->ww); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -2405,7 +2422,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->iw); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -2422,7 +2439,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%1d", &tmfc->q); - return 1 + SKIP_THth(suf); + return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_CC: @@ -2447,7 +2464,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%02d", &tmfc->cc); - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; @@ -2507,7 +2524,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, { sscanf(inout, "%04d", &tmfc->year); tmfc->yysz = 4; - return 4 + SKIP_THth(suf); + return strspace_len(inout) + 4 + SKIP_THth(suf); } } break; @@ -2540,7 +2557,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else tmfc->year += 2000; tmfc->yysz = 3; - return 3 + SKIP_THth(suf); + return strspace_len(inout) + 3 + SKIP_THth(suf); } break; case DCH_YY: @@ -2572,7 +2589,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else tmfc->year += 1900; tmfc->yysz = 2; - return 2 + SKIP_THth(suf); + return strspace_len(inout) + 2 + SKIP_THth(suf); } break; case DCH_Y: @@ -2600,7 +2617,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, */ tmfc->year += 2000; tmfc->yysz = 1; - return 1 + SKIP_THth(suf); + return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_RM: @@ -2652,7 +2669,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval, else { sscanf(inout, "%1d", &tmfc->w); - return 1 + SKIP_THth(suf); + return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_J: