11/* -----------------------------------------------------------------------
22 * formatting.c
33 *
4- * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.109 2006/04/19 14:48:06 momjian Exp $
4+ * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.110 2006/04/19 18:49:09 momjian Exp $
55 *
66 *
77 * Portions Copyright (c) 1999-2006, PostgreSQL Global Development Group
@@ -917,6 +917,7 @@ static void dump_node(FormatNode *node, int max);
917917
918918static char * get_th (char * num , int type );
919919static char * str_numth (char * dest , char * num , int type );
920+ static int strspace_len (char * str );
920921static int strdigits_len (char * str );
921922static char * str_toupper (char * buff );
922923static char * str_tolower (char * buff );
@@ -1686,12 +1687,28 @@ is_next_separator(FormatNode *n)
16861687 return TRUE; /* some non-digit input (separator) */
16871688}
16881689
1690+ static int
1691+ strspace_len (char * str )
1692+ {
1693+ int len = 0 ;
1694+
1695+ while (* str && isspace ((unsigned char ) * str ))
1696+ {
1697+ str ++ ;
1698+ len ++ ;
1699+ }
1700+ return len ;
1701+ }
1702+
16891703static int
16901704strdigits_len (char * str )
16911705{
16921706 char * p = str ;
1693- int len = 0 ;
1707+ int len ;
16941708
1709+ len = strspace_len (str );
1710+ p += len ;
1711+
16951712 while (* p && isdigit ((unsigned char ) * p ) && len <= DCH_MAX_ITEM_SIZ )
16961713 {
16971714 len ++ ;
@@ -1826,7 +1843,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18261843 else
18271844 {
18281845 sscanf (inout , "%02d" , & tmfc -> hh );
1829- return 2 + SKIP_THth (suf );
1846+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18301847 }
18311848 }
18321849 break ;
@@ -1848,7 +1865,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18481865 else
18491866 {
18501867 sscanf (inout , "%02d" , & tmfc -> hh );
1851- return 2 + SKIP_THth (suf );
1868+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18521869 }
18531870 }
18541871 break ;
@@ -1870,7 +1887,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18701887 else
18711888 {
18721889 sscanf (inout , "%02d" , & tmfc -> mi );
1873- return 2 + SKIP_THth (suf );
1890+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18741891 }
18751892 }
18761893 break ;
@@ -1892,7 +1909,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18921909 else
18931910 {
18941911 sscanf (inout , "%02d" , & tmfc -> ss );
1895- return 2 + SKIP_THth (suf );
1912+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18961913 }
18971914 }
18981915 break ;
@@ -1998,7 +2015,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
19982015 else
19992016 {
20002017 sscanf (inout , "%05d" , & tmfc -> ssss );
2001- return 5 + SKIP_THth (suf );
2018+ return strspace_len ( inout ) + 5 + SKIP_THth (suf );
20022019 }
20032020 }
20042021 break ;
@@ -2249,7 +2266,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
22492266 else
22502267 {
22512268 sscanf (inout , "%02d" , & tmfc -> mm );
2252- return 2 + SKIP_THth (suf );
2269+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
22532270 }
22542271 }
22552272 break ;
@@ -2323,7 +2340,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23232340 else
23242341 {
23252342 sscanf (inout , "%03d" , & tmfc -> ddd );
2326- return 3 + SKIP_THth (suf );
2343+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
23272344 }
23282345 }
23292346 break ;
@@ -2345,7 +2362,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23452362 else
23462363 {
23472364 sscanf (inout , "%02d" , & tmfc -> dd );
2348- return 2 + SKIP_THth (suf );
2365+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
23492366 }
23502367 }
23512368 break ;
@@ -2360,7 +2377,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23602377 else
23612378 {
23622379 sscanf (inout , "%1d" , & tmfc -> d );
2363- return 1 + SKIP_THth (suf );
2380+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
23642381 }
23652382 break ;
23662383 case DCH_WW :
@@ -2382,7 +2399,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23822399 else
23832400 {
23842401 sscanf (inout , "%02d" , & tmfc -> ww );
2385- return 2 + SKIP_THth (suf );
2402+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
23862403 }
23872404 }
23882405 break ;
@@ -2405,7 +2422,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24052422 else
24062423 {
24072424 sscanf (inout , "%02d" , & tmfc -> iw );
2408- return 2 + SKIP_THth (suf );
2425+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
24092426 }
24102427 }
24112428 break ;
@@ -2422,7 +2439,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24222439 else
24232440 {
24242441 sscanf (inout , "%1d" , & tmfc -> q );
2425- return 1 + SKIP_THth (suf );
2442+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
24262443 }
24272444 break ;
24282445 case DCH_CC :
@@ -2447,7 +2464,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24472464 else
24482465 {
24492466 sscanf (inout , "%02d" , & tmfc -> cc );
2450- return 2 + SKIP_THth (suf );
2467+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
24512468 }
24522469 }
24532470 break ;
@@ -2507,7 +2524,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25072524 {
25082525 sscanf (inout , "%04d" , & tmfc -> year );
25092526 tmfc -> yysz = 4 ;
2510- return 4 + SKIP_THth (suf );
2527+ return strspace_len ( inout ) + 4 + SKIP_THth (suf );
25112528 }
25122529 }
25132530 break ;
@@ -2540,7 +2557,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25402557 else
25412558 tmfc -> year += 2000 ;
25422559 tmfc -> yysz = 3 ;
2543- return 3 + SKIP_THth (suf );
2560+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
25442561 }
25452562 break ;
25462563 case DCH_YY :
@@ -2572,7 +2589,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25722589 else
25732590 tmfc -> year += 1900 ;
25742591 tmfc -> yysz = 2 ;
2575- return 2 + SKIP_THth (suf );
2592+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
25762593 }
25772594 break ;
25782595 case DCH_Y :
@@ -2600,7 +2617,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
26002617 */
26012618 tmfc -> year += 2000 ;
26022619 tmfc -> yysz = 1 ;
2603- return 1 + SKIP_THth (suf );
2620+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
26042621 }
26052622 break ;
26062623 case DCH_RM :
@@ -2652,7 +2669,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
26522669 else
26532670 {
26542671 sscanf (inout , "%1d" , & tmfc -> w );
2655- return 1 + SKIP_THth (suf );
2672+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
26562673 }
26572674 break ;
26582675 case DCH_J :
0 commit comments