|
|
|
|
@ -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); |
|
|
|
|
|