Re-export NextCopyFromRawFields() to copy.h.
authorMasahiko Sawada <[email protected]>
Fri, 28 Feb 2025 23:11:41 +0000 (15:11 -0800)
committerMasahiko Sawada <[email protected]>
Fri, 28 Feb 2025 23:11:41 +0000 (15:11 -0800)
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 <[email protected]>
Reviewed-by: Andrew Dunstan <[email protected]>
Reviewed-by: Sutou Kouhei <[email protected]>
Discussion: https://postgr.es/m/5c7e1ac8-5083-4c08-af19-cb9ade2f16ce@dunslane.net

src/backend/commands/copyfromparse.c
src/include/commands/copy.h

index bad577aa67b099735d0d2eecbf62bf8032509f23..e8128f85e6b5dad4df842beb8d6a2413322ced3b 100644 (file)
@@ -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 */
index 7bc044e2816e438e8c7bc8df5e5192670bdf0203..06dfdfef7210c7ff3ef0f6e8a4d56710ded2f1ae 100644 (file)
@@ -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);