@@ -182,6 +182,7 @@ static void CopySendInt16(CopyState cstate, int16 val);
182182static bool CopyGetInt16 (CopyState cstate , int16 * val );
183183static 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+ */
47294733static 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