mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Change a few routines into macros to improve speed of COPY IN inner loop.
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* backend->frontend functions
|
||||||
*
|
*
|
||||||
* CopyGetChar does the same for single characters
|
* 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
|
* 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.
|
* 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 */
|
*isnull = (bool) false; /* set default */
|
||||||
|
|
||||||
if (CopyGetEof(fp))
|
|
||||||
goto endOfFile;
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
c = CopyGetChar(fp);
|
c = CopyGetChar(fp);
|
||||||
if (CopyGetEof(fp))
|
if (c == EOF)
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
*newline = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strchr(delim, c))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (c == '\\')
|
if (c == '\\')
|
||||||
{
|
{
|
||||||
c = CopyGetChar(fp);
|
c = CopyGetChar(fp);
|
||||||
if (CopyGetEof(fp))
|
if (c == EOF)
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
@ -1213,14 +1207,14 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (CopyGetEof(fp))
|
if (c == EOF)
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
CopyDonePeek(fp, c, 0); /* Return to stream! */
|
CopyDonePeek(fp, c, 0); /* Return to stream! */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (CopyGetEof(fp))
|
if (c == EOF)
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
CopyDonePeek(fp, c, 0); /* Return to stream! */
|
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
|
rather then just 'N' to provide compatibility with
|
||||||
the default NULL output. -- pe */
|
the default NULL output. -- pe */
|
||||||
case 'N':
|
case 'N':
|
||||||
appendStringInfoChar(&attribute_buf, '\\');
|
appendStringInfoCharMacro(&attribute_buf, '\\');
|
||||||
c = 'N';
|
c = 'N';
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
@ -1257,16 +1251,9 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
|
|||||||
if (c != '\n')
|
if (c != '\n')
|
||||||
elog(ERROR, "CopyReadAttribute - end of record marker corrupted. line: %d", lineno);
|
elog(ERROR, "CopyReadAttribute - end of record marker corrupted. line: %d", lineno);
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (c == '\n' || inString(c, delim))
|
appendStringInfoCharMacro(&attribute_buf, c);
|
||||||
{
|
|
||||||
if (c == '\n')
|
|
||||||
*newline = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
appendStringInfoChar(&attribute_buf, c);
|
|
||||||
#ifdef MULTIBYTE
|
#ifdef MULTIBYTE
|
||||||
/* get additional bytes of the char, if any */
|
/* get additional bytes of the char, if any */
|
||||||
s[0] = c;
|
s[0] = c;
|
||||||
@ -1274,9 +1261,9 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
|
|||||||
for (j = 1; j < mblen; j++)
|
for (j = 1; j < mblen; j++)
|
||||||
{
|
{
|
||||||
c = CopyGetChar(fp);
|
c = CopyGetChar(fp);
|
||||||
if (CopyGetEof(fp))
|
if (c == EOF)
|
||||||
goto endOfFile;
|
goto endOfFile;
|
||||||
appendStringInfoChar(&attribute_buf, c);
|
appendStringInfoCharMacro(&attribute_buf, c);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* 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);
|
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
|
* appendBinaryStringInfo
|
||||||
* Append arbitrary binary data to a StringInfo, allocating more space
|
* Append arbitrary binary data to a StringInfo, allocating more space
|
||||||
* if necessary.
|
* if necessary.
|
||||||
*/
|
*/
|
||||||
extern void appendBinaryStringInfo(StringInfo str,
|
extern void appendBinaryStringInfo(StringInfo str,
|
||||||
const char *data, int datalen);
|
const char *data, int datalen);
|
||||||
|
|
||||||
#endif /* STRINGINFO_H */
|
#endif /* STRINGINFO_H */
|
||||||
|
Reference in New Issue
Block a user