summaryrefslogtreecommitdiff
path: root/src/backend/commands/copyto.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2024-08-16 13:48:10 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2024-08-16 13:48:10 +0300
commit3943da46bc54006ec4849bc7541cf4e674b700eb (patch)
tree51687bbe4a56ef92dc7b5f95feb77240b9eac1fa /src/backend/commands/copyto.c
parent1153422edac5d27eeffd61fca2be348fa0714ce9 (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 <jian.universality@gmail.com> Reviewed-by: Ilia Evdokimov, Junwang Zhao Discussion: https://www.postgresql.org/message-id/CACJufxFzHCeFBQF0M%2BSgk_NwknWuQ4oU7tS1isVeBrbhcKOHkg@mail.gmail.com
Diffstat (limited to 'src/backend/commands/copyto.c')
-rw-r--r--src/backend/commands/copyto.c39
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);