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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy