Commit a8656a3a authored by Robert Haas's avatar Robert Haas

Make NUM_TOCHAR_prepare and NUM_TOCHAR_finish macros declare "len".

Remove the variable from the enclosing scopes so that nothing can be
relying on it.  The net result of this refactoring is that we get rid
of a few unnecessary strlen() calls.

Original patch from Greg Jaskiewicz, substantially expanded by me.
parent 9d140f7b
...@@ -4877,7 +4877,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, ...@@ -4877,7 +4877,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
*/ */
#define NUM_TOCHAR_prepare \ #define NUM_TOCHAR_prepare \
do { \ do { \
len = VARSIZE_ANY_EXHDR(fmt); \ int len = VARSIZE_ANY_EXHDR(fmt); \
if (len <= 0 || len >= (INT_MAX-VARHDRSZ)/NUM_MAX_ITEM_SIZ) \ if (len <= 0 || len >= (INT_MAX-VARHDRSZ)/NUM_MAX_ITEM_SIZ) \
PG_RETURN_TEXT_P(cstring_to_text("")); \ PG_RETURN_TEXT_P(cstring_to_text("")); \
result = (text *) palloc0((len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \ result = (text *) palloc0((len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \
...@@ -4890,6 +4890,8 @@ do { \ ...@@ -4890,6 +4890,8 @@ do { \
*/ */
#define NUM_TOCHAR_finish \ #define NUM_TOCHAR_finish \
do { \ do { \
int len; \
\
NUM_processor(format, &Num, VARDATA(result), numstr, plen, sign, true, PG_GET_COLLATION()); \ NUM_processor(format, &Num, VARDATA(result), numstr, plen, sign, true, PG_GET_COLLATION()); \
\ \
if (shouldFree) \ if (shouldFree) \
...@@ -4961,8 +4963,7 @@ numeric_to_char(PG_FUNCTION_ARGS) ...@@ -4961,8 +4963,7 @@ numeric_to_char(PG_FUNCTION_ARGS)
FormatNode *format; FormatNode *format;
text *result; text *result;
bool shouldFree; bool shouldFree;
int len = 0, int plen = 0,
plen = 0,
sign = 0; sign = 0;
char *numstr, char *numstr,
*orgnum, *orgnum,
...@@ -5008,16 +5009,15 @@ numeric_to_char(PG_FUNCTION_ARGS) ...@@ -5008,16 +5009,15 @@ numeric_to_char(PG_FUNCTION_ARGS)
numstr = (char *) palloc(strlen(orgnum) + 2); numstr = (char *) palloc(strlen(orgnum) + 2);
*numstr = ' '; *numstr = ' ';
strcpy(numstr + 1, orgnum); strcpy(numstr + 1, orgnum);
len = strlen(numstr);
} }
else else
{ {
numstr = orgnum; numstr = orgnum;
len = strlen(orgnum);
} }
} }
else else
{ {
int len;
Numeric val = value; Numeric val = value;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
...@@ -5084,8 +5084,7 @@ int4_to_char(PG_FUNCTION_ARGS) ...@@ -5084,8 +5084,7 @@ int4_to_char(PG_FUNCTION_ARGS)
FormatNode *format; FormatNode *format;
text *result; text *result;
bool shouldFree; bool shouldFree;
int len = 0, int plen = 0,
plen = 0,
sign = 0; sign = 0;
char *numstr, char *numstr,
*orgnum; *orgnum;
...@@ -5111,11 +5110,12 @@ int4_to_char(PG_FUNCTION_ARGS) ...@@ -5111,11 +5110,12 @@ int4_to_char(PG_FUNCTION_ARGS)
if (*orgnum == '+') if (*orgnum == '+')
*orgnum = ' '; *orgnum = ' ';
len = strlen(orgnum);
numstr = orgnum; numstr = orgnum;
} }
else else
{ {
int len;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
orgnum = DatumGetCString(DirectFunctionCall1(int4out, orgnum = DatumGetCString(DirectFunctionCall1(int4out,
...@@ -5175,8 +5175,7 @@ int8_to_char(PG_FUNCTION_ARGS) ...@@ -5175,8 +5175,7 @@ int8_to_char(PG_FUNCTION_ARGS)
FormatNode *format; FormatNode *format;
text *result; text *result;
bool shouldFree; bool shouldFree;
int len = 0, int plen = 0,
plen = 0,
sign = 0; sign = 0;
char *numstr, char *numstr,
*orgnum; *orgnum;
...@@ -5211,16 +5210,16 @@ int8_to_char(PG_FUNCTION_ARGS) ...@@ -5211,16 +5210,16 @@ int8_to_char(PG_FUNCTION_ARGS)
numstr = (char *) palloc(strlen(orgnum) + 2); numstr = (char *) palloc(strlen(orgnum) + 2);
*numstr = ' '; *numstr = ' ';
strcpy(numstr + 1, orgnum); strcpy(numstr + 1, orgnum);
len = strlen(numstr);
} }
else else
{ {
numstr = orgnum; numstr = orgnum;
len = strlen(orgnum);
} }
} }
else else
{ {
int len;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
double multi = pow((double) 10, (double) Num.multi); double multi = pow((double) 10, (double) Num.multi);
...@@ -5282,8 +5281,7 @@ float4_to_char(PG_FUNCTION_ARGS) ...@@ -5282,8 +5281,7 @@ float4_to_char(PG_FUNCTION_ARGS)
FormatNode *format; FormatNode *format;
text *result; text *result;
bool shouldFree; bool shouldFree;
int len = 0, int plen = 0,
plen = 0,
sign = 0; sign = 0;
char *numstr, char *numstr,
*orgnum, *orgnum,
...@@ -5317,13 +5315,13 @@ float4_to_char(PG_FUNCTION_ARGS) ...@@ -5317,13 +5315,13 @@ float4_to_char(PG_FUNCTION_ARGS)
if (*orgnum == '+') if (*orgnum == '+')
*orgnum = ' '; *orgnum = ' ';
len = strlen(orgnum);
numstr = orgnum; numstr = orgnum;
} }
} }
else else
{ {
float4 val = value; float4 val = value;
int len;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
...@@ -5386,8 +5384,7 @@ float8_to_char(PG_FUNCTION_ARGS) ...@@ -5386,8 +5384,7 @@ float8_to_char(PG_FUNCTION_ARGS)
FormatNode *format; FormatNode *format;
text *result; text *result;
bool shouldFree; bool shouldFree;
int len = 0, int plen = 0,
plen = 0,
sign = 0; sign = 0;
char *numstr, char *numstr,
*orgnum, *orgnum,
...@@ -5421,13 +5418,13 @@ float8_to_char(PG_FUNCTION_ARGS) ...@@ -5421,13 +5418,13 @@ float8_to_char(PG_FUNCTION_ARGS)
if (*orgnum == '+') if (*orgnum == '+')
*orgnum = ' '; *orgnum = ' ';
len = strlen(orgnum);
numstr = orgnum; numstr = orgnum;
} }
} }
else else
{ {
float8 val = value; float8 val = value;
int len;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment