]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Speedup COPY FROM with additional function inlining.
authorNathan Bossart <nathan@postgresql.org>
Fri, 20 Feb 2026 18:07:27 +0000 (12:07 -0600)
committerNathan Bossart <nathan@postgresql.org>
Fri, 20 Feb 2026 18:07:27 +0000 (12:07 -0600)
Following the example set by commit 58a359e585, we can squeeze out
a little more performance from COPY FROM (FORMAT {text,csv}) by
inlining CopyReadLineText() and passing the is_csv parameter as a
constant.  This allows the compiler to emit specialized code with
fewer branches.

This is preparatory work for a proposed follow-up commit that would
further optimize this code with SIMD instructions.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Reviewed-by: Ayoub Kazar <ma_kazar@esi.dz>
Tested-by: Manni Wood <manni.wood@enterprisedb.com>
Discussion: https://postgr.es/m/CAOzEurSW8cNr6TPKsjrstnPfhf4QyQqB4tnPXGGe8N4e_v7Jig%40mail.gmail.com

src/backend/commands/copyfromparse.c

index 94d6f415a069dc7ad935ebc98f32d609754abbed..6b00d49c50fa9414055fbfdb3d2fae4970f7a50e 100644 (file)
@@ -141,7 +141,8 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
 
 /* non-export function prototypes */
 static bool CopyReadLine(CopyFromState cstate, bool is_csv);
-static bool CopyReadLineText(CopyFromState cstate, bool is_csv);
+static pg_attribute_always_inline bool CopyReadLineText(CopyFromState cstate,
+                                                                                                               bool is_csv);
 static int     CopyReadAttributesText(CopyFromState cstate);
 static int     CopyReadAttributesCSV(CopyFromState cstate);
 static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo,
@@ -1173,8 +1174,17 @@ CopyReadLine(CopyFromState cstate, bool is_csv)
        resetStringInfo(&cstate->line_buf);
        cstate->line_buf_valid = false;
 
-       /* Parse data and transfer into line_buf */
-       result = CopyReadLineText(cstate, is_csv);
+       /*
+        * Parse data and transfer into line_buf.
+        *
+        * Because this is performance critical, we inline CopyReadLineText() and
+        * pass the boolean parameters as constants to allow the compiler to emit
+        * specialized code with fewer branches.
+        */
+       if (is_csv)
+               result = CopyReadLineText(cstate, true);
+       else
+               result = CopyReadLineText(cstate, false);
 
        if (result)
        {
@@ -1241,7 +1251,7 @@ CopyReadLine(CopyFromState cstate, bool is_csv)
 /*
  * CopyReadLineText - inner loop of CopyReadLine for text mode
  */
-static bool
+static pg_attribute_always_inline bool
 CopyReadLineText(CopyFromState cstate, bool is_csv)
 {
        char       *copy_input_buf;