postgres.git / summary / log / commit / refs

commit    dc592a41557b072178f1798700bf9c69cd8e4235
Author:   Nathan Bossart <nathan@postgresql.org>
Date:     Fri Feb 20 18:07:27 2026 +0000

    Speedup COPY FROM with additional function inlining.
    
    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 | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index 94d6f415a06..6b00d49c50f 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -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; [parent: 18bcdb75d155]