On Fri, Jun 27, 2025 at 12:03 AM Fujii Masao <masao.fu...@oss.nttdata.com> wrote:
> > > On 2025/06/26 19:12, Shinya Kato wrote: > > On Thu, Jun 26, 2025 at 4:36 PM Fujii Masao <masao.fu...@oss.nttdata.com > <mailto:masao.fu...@oss.nttdata.com>> wrote: > > > > On 2025/06/26 14:35, Shinya Kato wrote: > > > > > > > > So it seems better for you to implement the patch at first > and then > > > > > check the performance overhead etc if necessary. > > > > > > > > Thank you for your advice. I will create a patch. > > > > > > I created a patch. > > > > Thanks for the patch! > > > > > > Thank you for your review. > > > > When I compiled with the patch applied, I got the following warning: > > > > copyfromparse.c:834:20: error: ‘done’ may be used uninitialized > [-Werror=maybe-uninitialized] > > 834 | if (done) > > | ^ > > > > > > Oh, sorry. I missed it. > > I fixed it to initialize done = false. > > > > + lines are discarded. An integer value greater than 1 is only > valid for > > + <command>COPY FROM</command> commands. > > > > > > This might be slightly misleading since 0 is also a valid value for > COPY FROM. > > > > That's certainly true. I fixed it below: > > + lines are discarded. An integer value greater than 1 is not > allowed for > > + <command>COPY TO</command> commands. > > Thanks for fixing that! However, it's odd that the description for COPY TO > appears > under the section starting with "On input." Shouldn't it be under the "On > output" > section instead? > > Also, I think the entire HEADER option section could use a clearer > structure. > How about revising it like this? > > --------------------- > <listitem> > <para> > - Specifies that the file contains a header line with the names of > each > - column in the file. On output, the first line contains the column > - names from the table. On input, the first line is discarded when > this > - option is set to <literal>true</literal> (or equivalent Boolean > value). > - If this option is set to <literal>MATCH</literal>, the number and > names > - of the columns in the header line must match the actual column > names of > - the table, in order; otherwise an error is raised. > + On output, if this option is set to <literal>true</literal> > + (or an equivalent Boolean value), the first line of the output will > + contain the column names from the table. > + Integer values <literal>0</literal> and <literal>1</literal> are > + accepted as Boolean values, but other integers are not allowed for > + <command>COPY TO</command> commands. > + </para> > + <para> > + On input, if this option is set to <literal>true</literal> > + (or an equivalent Boolean value), the first line of the input is > + discarded. If it is set to a non-negative integer, that number of > + lines are discarded. If the option is set to > <literal>MATCH</literal>, > + the number and names of the columns in the header line must exactly > + match those of the table, in order; otherwise an error is raised. > + The <literal>MATCH</literal> value is only valid for > + <command>COPY FROM</command> commands. > + </para> > + <para> > This option is not allowed when using <literal>binary</literal> > format. > - The <literal>MATCH</literal> option is only valid for <command>COPY > - FROM</command> commands. > </para> > </listitem> > --------------------- > Yes, your documentation is clearer than mine. > > Also, similar to the existing "boolean" type explanation in the COPY docs, > we should add a corresponding entry for integer, now that it's accepted by > the HEADER option. The VACUUM docs has a good example of how to phrase > this. > Exactly. > > Original error message "%s requires a Boolean value, integer value, or > \"match\"" should also be fixed to "non-negative integer"? > > Yes, I think that the message > > "%s requires a Boolean value, a non-negative integer, or the string > \"match\"" > > is clearer and more accurate. Thank you, you're right. > -typedef enum CopyHeaderChoice > +typedef struct CopyHeaderOption > { > - COPY_HEADER_FALSE = 0, > - COPY_HEADER_TRUE, > - COPY_HEADER_MATCH, > -} CopyHeaderChoice; > + bool match; /* header line must match actual names? */ > + int skip_lines; /* number of lines to skip before > data */ > +} CopyHeaderOption; > <snip> > - CopyHeaderChoice header_line; /* header line? */ > + CopyHeaderOption header; /* header line? */ > > Wouldn't it be simpler to just use an integer instead of introducing > CopyHeaderOption? We could use 0 for false, 1 for true, n > 1 for skipping > lines, > and -1 for MATCH in that integer. > > This would simplify the logic in defGetCopyHeaderOption(). > I've attached a patch that shows this idea in action. Thought? > I thought about the approach, and had a minor concern about the following inconsistency between the option and its internal implementation: - When the option is set to "MATCH", header_line becomes -1. - When the option is set to -1, it's an error. However, your patch is clear, and it seems we don't need to worry about this concern. Your patch looks good to me. -- Best regards, Shinya Kato NTT OSS Center