diff options
author | Heikki Linnakangas | 2024-08-16 10:48:10 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2024-08-16 10:48:10 +0000 |
commit | 3943da46bc54006ec4849bc7541cf4e674b700eb (patch) | |
tree | 51687bbe4a56ef92dc7b5f95feb77240b9eac1fa /src/backend/commands/copyto.c | |
parent | 1153422edac5d27eeffd61fca2be348fa0714ce9 (diff) |
Refactor CopyOneRowTo
The handling of binary and text formats are quite different here, so
it's more clear to check for the format first and have two separate
loops.
Author: jian he <[email protected]>
Reviewed-by: Ilia Evdokimov, Junwang Zhao
Discussion: https://www.postgresql.org/message-id/CACJufxFzHCeFBQF0M%[email protected]
Diffstat (limited to 'src/backend/commands/copyto.c')
-rw-r--r-- | src/backend/commands/copyto.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index eb1d3d8fbb5..91de442f434 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -902,11 +902,8 @@ DoCopyTo(CopyToState cstate) static void CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot) { - bool need_delim = false; FmgrInfo *out_functions = cstate->out_functions; MemoryContext oldcontext; - ListCell *cur; - char *string; MemoryContextReset(cstate->rowcontext); oldcontext = MemoryContextSwitchTo(cstate->rowcontext); @@ -920,29 +917,23 @@ CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot) /* Make sure the tuple is fully deconstructed */ slot_getallattrs(slot); - foreach(cur, cstate->attnumlist) + if (!cstate->opts.binary) { - int attnum = lfirst_int(cur); - Datum value = slot->tts_values[attnum - 1]; - bool isnull = slot->tts_isnull[attnum - 1]; + bool need_delim = false; - if (!cstate->opts.binary) + foreach_int(attnum, cstate->attnumlist) { + Datum value = slot->tts_values[attnum - 1]; + bool isnull = slot->tts_isnull[attnum - 1]; + char *string; + if (need_delim) CopySendChar(cstate, cstate->opts.delim[0]); need_delim = true; - } - if (isnull) - { - if (!cstate->opts.binary) + if (isnull) CopySendString(cstate, cstate->opts.null_print_client); else - CopySendInt32(cstate, -1); - } - else - { - if (!cstate->opts.binary) { string = OutputFunctionCall(&out_functions[attnum - 1], value); @@ -952,10 +943,20 @@ CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot) else CopyAttributeOutText(cstate, string); } + } + } + else + { + foreach_int(attnum, cstate->attnumlist) + { + Datum value = slot->tts_values[attnum - 1]; + bool isnull = slot->tts_isnull[attnum - 1]; + bytea *outputbytes; + + if (isnull) + CopySendInt32(cstate, -1); else { - bytea *outputbytes; - outputbytes = SendFunctionCall(&out_functions[attnum - 1], value); CopySendInt32(cstate, VARSIZE(outputbytes) - VARHDRSZ); |