diff options
author | Masahiko Sawada <msawada@postgresql.org> | 2025-02-28 15:11:41 -0800 |
---|---|---|
committer | Masahiko Sawada <msawada@postgresql.org> | 2025-02-28 15:11:41 -0800 |
commit | 8a1012b35d6123d8ee1818fce68f435459e297b7 (patch) | |
tree | 2461a5d8e6005cd81629465e3b0385317800ad79 /src | |
parent | e636da92002857c24f8b66b6ac4a47ff91803c06 (diff) | |
download | postgresql-8a1012b35d6123d8ee1818fce68f435459e297b7.tar.gz postgresql-8a1012b35d6123d8ee1818fce68f435459e297b7.zip |
Re-export NextCopyFromRawFields() to copy.h.
Commit 7717f630069 removed NextCopyFromRawFields() from copy.h. While
it was hoped that NextCopyFrom() could serve as an alternative,
certain use cases still require NextCopyFromRawFields(). For instance,
extensions like file_text_array_fdw, which process source data with an
unknown number of columns, rely on this function.
Per buildfarm member crake.
Reported-by: Andrew Dunstan <andrew@dunslane.net>
Reviewed-by: Andrew Dunstan <andrew@dunslane.net>
Reviewed-by: Sutou Kouhei <kou@clear-code.com>
Discussion: https://postgr.es/m/5c7e1ac8-5083-4c08-af19-cb9ade2f16ce@dunslane.net
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/copyfromparse.c | 28 | ||||
-rw-r--r-- | src/include/commands/copy.h | 2 |
2 files changed, 25 insertions, 5 deletions
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index bad577aa67b..e8128f85e6b 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -152,6 +152,10 @@ static pg_attribute_always_inline bool CopyFromTextLikeOneRow(CopyFromState csta Datum *values, bool *nulls, bool is_csv); +static pg_attribute_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate, + char ***fields, + int *nfields, + bool is_csv); /* Low-level communications functions */ @@ -736,8 +740,21 @@ CopyReadBinaryData(CopyFromState cstate, char *dest, int nbytes) } /* - * Read raw fields in the next line for COPY FROM in text or csv mode. - * Return false if no more lines. + * This function is exposed for use by extensions that read raw fields in the + * next line. See NextCopyFromRawFieldsInternal() for details. + */ +bool +NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields) +{ + return NextCopyFromRawFieldsInternal(cstate, fields, nfields, + cstate->opts.csv_mode); +} + +/* + * Workhorse for NextCopyFromRawFields(). + * + * Read raw fields in the next line for COPY FROM in text or csv mode. Return + * false if no more lines. * * An internal temporary buffer is returned via 'fields'. It is valid until * the next call of the function. Since the function returns all raw fields @@ -747,10 +764,11 @@ CopyReadBinaryData(CopyFromState cstate, char *dest, int nbytes) * NOTE: force_not_null option are not applied to the returned fields. * * We use pg_attribute_always_inline to reduce function call overhead - * and to help compilers to optimize away the 'is_csv' condition. + * and to help compilers to optimize away the 'is_csv' condition when called + * by internal functions such as CopyFromTextLikeOneRow(). */ static pg_attribute_always_inline bool -NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields, bool is_csv) +NextCopyFromRawFieldsInternal(CopyFromState cstate, char ***fields, int *nfields, bool is_csv) { int fldct; bool done; @@ -934,7 +952,7 @@ CopyFromTextLikeOneRow(CopyFromState cstate, ExprContext *econtext, attr_count = list_length(cstate->attnumlist); /* read raw fields in the next line */ - if (!NextCopyFromRawFields(cstate, &field_strings, &fldct, is_csv)) + if (!NextCopyFromRawFieldsInternal(cstate, &field_strings, &fldct, is_csv)) return false; /* check for overflowing fields */ diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index 7bc044e2816..06dfdfef721 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -107,6 +107,8 @@ extern CopyFromState BeginCopyFrom(ParseState *pstate, Relation rel, Node *where extern void EndCopyFrom(CopyFromState cstate); extern bool NextCopyFrom(CopyFromState cstate, ExprContext *econtext, Datum *values, bool *nulls); +extern bool NextCopyFromRawFields(CopyFromState cstate, + char ***fields, int *nfields); extern void CopyFromErrorCallback(void *arg); extern char *CopyLimitPrintoutLength(const char *str); |