Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5d096d0

Browse files
committed
Fix problem that sscanf(buf, "%d", &val) eats leading white space, but
our to_* functions were not handling that.
1 parent04ca4ca commit5d096d0

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/1914:48:06 momjian Exp $
4+
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.110 2006/04/1918: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
staticchar*get_th(char*num,inttype);
919919
staticchar*str_numth(char*dest,char*num,inttype);
920+
staticintstrspace_len(char*str);
920921
staticintstrdigits_len(char*str);
921922
staticchar*str_toupper(char*buff);
922923
staticchar*str_tolower(char*buff);
@@ -1686,12 +1687,28 @@ is_next_separator(FormatNode *n)
16861687
return TRUE;/* some non-digit input (separator) */
16871688
}
16881689

1690+
staticint
1691+
strspace_len(char*str)
1692+
{
1693+
intlen=0;
1694+
1695+
while (*str&&isspace((unsignedchar)*str))
1696+
{
1697+
str++;
1698+
len++;
1699+
}
1700+
returnlen;
1701+
}
1702+
16891703
staticint
16901704
strdigits_len(char*str)
16911705
{
16921706
char*p=str;
1693-
intlen=0;
1707+
intlen;
16941708

1709+
len=strspace_len(str);
1710+
p+=len;
1711+
16951712
while (*p&&isdigit((unsignedchar)*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-
return2+SKIP_THth(suf);
1846+
returnstrspace_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-
return2+SKIP_THth(suf);
1868+
returnstrspace_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-
return2+SKIP_THth(suf);
1890+
returnstrspace_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-
return2+SKIP_THth(suf);
1912+
returnstrspace_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-
return5+SKIP_THth(suf);
2018+
returnstrspace_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-
return2+SKIP_THth(suf);
2269+
returnstrspace_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-
return3+SKIP_THth(suf);
2343+
returnstrspace_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-
return2+SKIP_THth(suf);
2365+
returnstrspace_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-
return1+SKIP_THth(suf);
2380+
returnstrspace_len(inout)+1+SKIP_THth(suf);
23642381
}
23652382
break;
23662383
caseDCH_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-
return2+SKIP_THth(suf);
2402+
returnstrspace_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-
return2+SKIP_THth(suf);
2425+
returnstrspace_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-
return1+SKIP_THth(suf);
2442+
returnstrspace_len(inout)+1+SKIP_THth(suf);
24262443
}
24272444
break;
24282445
caseDCH_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-
return2+SKIP_THth(suf);
2467+
returnstrspace_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-
return4+SKIP_THth(suf);
2527+
returnstrspace_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-
return3+SKIP_THth(suf);
2560+
returnstrspace_len(inout)+3+SKIP_THth(suf);
25442561
}
25452562
break;
25462563
caseDCH_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-
return2+SKIP_THth(suf);
2592+
returnstrspace_len(inout)+2+SKIP_THth(suf);
25762593
}
25772594
break;
25782595
caseDCH_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-
return1+SKIP_THth(suf);
2620+
returnstrspace_len(inout)+1+SKIP_THth(suf);
26042621
}
26052622
break;
26062623
caseDCH_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-
return1+SKIP_THth(suf);
2672+
returnstrspace_len(inout)+1+SKIP_THth(suf);
26562673
}
26572674
break;
26582675
caseDCH_J:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp