Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 7f4b13e

Browse files
committed
Allow COPY FROM to par8d table even if some FDW parts can't do that.
This behaviour was broken in patches allowing COPY FROM to FDW tables.
1 parent a7c7d31 commit 7f4b13e

File tree

2 files changed

+30
-19
lines changed

2 files changed

+30
-19
lines changed

contrib/file_fdw/output/file_fdw.source

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ SELECT tableoid::regclass, * FROM p2;
315315
(0 rows)
316316

317317
COPY pt FROM '@abs_srcdir@/data/list2.bad' with (format 'csv', delimiter ','); -- ERROR
318-
ERROR: cannot route inserted tuples to a foreign table
318+
ERROR: FDW adapter for relation "p1" doesn't support COPY FROM
319319
CONTEXT: COPY pt, line 2: "1,qux"
320320
COPY pt FROM '@abs_srcdir@/data/list2.csv' with (format 'csv', delimiter ',');
321321
SELECT tableoid::regclass, * FROM pt;

src/backend/commands/copy.c

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ static void CopySendInt16(CopyState cstate, int16 val);
182182
static bool CopyGetInt16(CopyState cstate, int16 *val);
183183
static void InitForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo,
184184
CopyState cstate, char *dest_relname);
185+
static void EndForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo);
185186

186187

187188
/*
@@ -2638,6 +2639,13 @@ CopyFrom(CopyState cstate)
26382639
}
26392640
else /* FDW table */
26402641
{
2642+
if (!FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
2643+
ereport(ERROR,
2644+
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
2645+
errmsg("FDW adapter for relation \"%s\" doesn't support COPY FROM",
2646+
RelationGetRelationName(
2647+
resultRelInfo->ri_RelationDesc))));
2648+
26412649
resultRelInfo->ri_FdwRoutine->ForeignNextCopyFrom(
26422650
estate, resultRelInfo, cstate);
26432651
}
@@ -2702,11 +2710,7 @@ CopyFrom(CopyState cstate)
27022710
/*
27032711
* Shut down FDW.
27042712
*/
2705-
if (resultRelInfo->ri_FdwRoutine)
2706-
{
2707-
resultRelInfo->ri_FdwRoutine->EndForeignCopyFrom(
2708-
estate, resultRelInfo);
2709-
}
2713+
EndForeignCopyFrom(estate, resultRelInfo);
27102714

27112715
/* Close all the partitioned tables, leaf partitions, and their indices */
27122716
if (cstate->partition_dispatch_info)
@@ -2730,11 +2734,8 @@ CopyFrom(CopyState cstate)
27302734
{
27312735
ResultRelInfo *resultRelInfo = cstate->partitions + i;
27322736

2733-
if (resultRelInfo->ri_FdwRoutine)
2734-
{
2735-
resultRelInfo->ri_FdwRoutine->EndForeignCopyFrom(
2736-
estate, resultRelInfo);
2737-
}
2737+
EndForeignCopyFrom(estate, resultRelInfo);
2738+
27382739
ExecCloseIndices(resultRelInfo);
27392740
heap_close(resultRelInfo->ri_RelationDesc, NoLock);
27402741
}
@@ -4726,19 +4727,29 @@ CreateCopyDestReceiver(void)
47264727
return (DestReceiver *) self;
47274728
}
47284729

4730+
/*
4731+
* Start COPY FROM on foreign relation, if possible. If not, just do nothing.
4732+
*/
47294733
static void InitForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo,
47304734
CopyState cstate, char *dest_relname)
47314735
{
4732-
if (resultRelInfo->ri_FdwRoutine)
4736+
if (resultRelInfo->ri_FdwRoutine &&
4737+
FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
47334738
{
4734-
FdwRoutine *fdwroutine = resultRelInfo->ri_FdwRoutine;
4735-
4736-
if (!FdwCopyFromIsSupported(fdwroutine))
4737-
ereport(ERROR,
4738-
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
4739-
errmsg("FDW adapter for relation \"%s\" doesn't support COPY FROM",
4740-
RelationGetRelationName(resultRelInfo->ri_RelationDesc))));
47414739
resultRelInfo->ri_FdwRoutine->
47424740
BeginForeignCopyFrom(estate, resultRelInfo, cstate, dest_relname);
47434741
}
47444742
}
4743+
4744+
/*
4745+
* Finish COPY FROM on foreign relation, if needed.
4746+
*/
4747+
static void EndForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo)
4748+
{
4749+
if (resultRelInfo->ri_FdwRoutine &&
4750+
FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
4751+
{
4752+
resultRelInfo->ri_FdwRoutine->EndForeignCopyFrom(
4753+
estate, resultRelInfo);
4754+
}
4755+
}

0 commit comments

Comments
 (0)