From 03ff27129c09358559cc6d9f1b0ce389daa9f6e1 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Fri, 28 Feb 2025 12:43:29 -0800 Subject: [PATCH] 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 Reviewed-by: Andrew Dunstan Discussion: https://postgr.es/m/5c7e1ac8-5083-4c08-af19-cb9ade2f16ce@dunslane.net --- src/backend/commands/copyfromparse.c | 20 +++++++++++++++++--- src/include/commands/copy.h | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index bad577aa67b..9f81557f245 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 */ @@ -738,6 +742,15 @@ 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. + */ +bool +NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields, bool is_csv) +{ + return NextCopyFromRawFieldsInternal(cstate, fields, nfields, is_csv); +} + +/* + * Workhorse for NextCopyFromRawFields(). * * 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 +760,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 +948,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..f8784eb9554 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, bool is_csv); extern void CopyFromErrorCallback(void *arg); extern char *CopyLimitPrintoutLength(const char *str); -- 2.43.5