Change a few routines into macros to improve speed of COPY IN inner loop.

This commit is contained in:
Tom Lane 2000-01-22 03:52:04 +00:00
parent d32cd1bb25
commit 5c33b3c658
2 changed files with 32 additions and 35 deletions

View File

@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.97 2000/01/19 23:54:56 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.98 2000/01/22 03:52:04 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -137,7 +137,8 @@ CopySendChar(char c, FILE *fp)
* backend->frontend functions
*
* CopyGetChar does the same for single characters
* CopyGetEof checks if it's EOF on the input
* CopyGetEof checks if it's EOF on the input (or, check for EOF result
* from CopyGetChar)
*
* NB: no data conversion is applied by these functions
*/
@ -1106,18 +1107,6 @@ GetIndexRelations(Oid main_relation_oid,
}
}
/*
returns 1 if c is in s
*/
static bool
inString(char c, char *s)
{
if (s && c)
return strchr(s, c) != NULL;
return 0;
}
/*
* Reads input from fp until an end of line is seen.
*/
@ -1171,19 +1160,24 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
*isnull = (bool) false; /* set default */
if (CopyGetEof(fp))
goto endOfFile;
for (;;)
{
c = CopyGetChar(fp);
if (CopyGetEof(fp))
if (c == EOF)
goto endOfFile;
if (c == '\n')
{
*newline = 1;
break;
}
if (strchr(delim, c))
{
break;
}
if (c == '\\')
{
c = CopyGetChar(fp);
if (CopyGetEof(fp))
if (c == EOF)
goto endOfFile;
switch (c)
{
@ -1213,14 +1207,14 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
}
else
{
if (CopyGetEof(fp))
if (c == EOF)
goto endOfFile;
CopyDonePeek(fp, c, 0); /* Return to stream! */
}
}
else
{
if (CopyGetEof(fp))
if (c == EOF)
goto endOfFile;
CopyDonePeek(fp, c, 0); /* Return to stream! */
}
@ -1231,7 +1225,7 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
rather then just 'N' to provide compatibility with
the default NULL output. -- pe */
case 'N':
appendStringInfoChar(&attribute_buf, '\\');
appendStringInfoCharMacro(&attribute_buf, '\\');
c = 'N';
break;
case 'b':
@ -1257,16 +1251,9 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
if (c != '\n')
elog(ERROR, "CopyReadAttribute - end of record marker corrupted. line: %d", lineno);
goto endOfFile;
break;
}
}
else if (c == '\n' || inString(c, delim))
{
if (c == '\n')
*newline = 1;
break;
}
appendStringInfoChar(&attribute_buf, c);
appendStringInfoCharMacro(&attribute_buf, c);
#ifdef MULTIBYTE
/* get additional bytes of the char, if any */
s[0] = c;
@ -1274,9 +1261,9 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
for (j = 1; j < mblen; j++)
{
c = CopyGetChar(fp);
if (CopyGetEof(fp))
if (c == EOF)
goto endOfFile;
appendStringInfoChar(&attribute_buf, c);
appendStringInfoCharMacro(&attribute_buf, c);
}
#endif
}

View File

@ -9,7 +9,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: stringinfo.h,v 1.14 1999/08/31 01:28:21 tgl Exp $
* $Id: stringinfo.h,v 1.15 2000/01/22 03:52:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -89,12 +89,22 @@ extern void appendStringInfo(StringInfo str, const char *fmt,...);
*/
extern void appendStringInfoChar(StringInfo str, char ch);
/*------------------------
* appendStringInfoCharMacro
* As above, but a macro for even more speed where it matters.
* Caution: str argument will be evaluated multiple times.
*/
#define appendStringInfoCharMacro(str,ch) \
(((str)->len + 1 >= (str)->maxlen) ? \
appendStringInfoChar(str, ch) : \
((str)->data[(str)->len] = (ch), (str)->data[++(str)->len] = '\0'))
/*------------------------
* appendBinaryStringInfo
* Append arbitrary binary data to a StringInfo, allocating more space
* if necessary.
*/
extern void appendBinaryStringInfo(StringInfo str,
const char *data, int datalen);
const char *data, int datalen);
#endif /* STRINGINFO_H */