Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5d096d0

Browse files
committed
Fix problem that sscanf(buf, "%d", &val) eats leading white space, but
our to_* functions were not handling that.
1 parent 04ca4ca commit 5d096d0

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

src/backend/utils/adt/formatting.c

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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

918918
static char *get_th(char *num, int type);
919919
static char *str_numth(char *dest, char *num, int type);
920+
static int strspace_len(char *str);
920921
static int strdigits_len(char *str);
921922
static char *str_toupper(char *buff);
922923
static 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+
16891703
static int
16901704
strdigits_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

Comments
 (0)