From: Nathan Bossart Date: Fri, 20 Feb 2026 18:07:27 +0000 (-0600) Subject: Speedup COPY FROM with additional function inlining. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dc592a41557b072178f1798700bf9c69cd8e4235;p=thirdparty%2Fpostgresql.git 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 Reviewed-by: Ayoub Kazar Tested-by: Manni Wood Discussion: https://postgr.es/m/CAOzEurSW8cNr6TPKsjrstnPfhf4QyQqB4tnPXGGe8N4e_v7Jig%40mail.gmail.com --- 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;