@@ -182,6 +182,7 @@ static void CopySendInt16(CopyState cstate, int16 val);
182
182
static bool CopyGetInt16 (CopyState cstate , int16 * val );
183
183
static void InitForeignCopyFrom (EState * estate , ResultRelInfo * resultRelInfo ,
184
184
CopyState cstate , char * dest_relname );
185
+ static void EndForeignCopyFrom (EState * estate , ResultRelInfo * resultRelInfo );
185
186
186
187
187
188
/*
@@ -2638,6 +2639,13 @@ CopyFrom(CopyState cstate)
2638
2639
}
2639
2640
else /* FDW table */
2640
2641
{
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
+
2641
2649
resultRelInfo -> ri_FdwRoutine -> ForeignNextCopyFrom (
2642
2650
estate , resultRelInfo , cstate );
2643
2651
}
@@ -2702,11 +2710,7 @@ CopyFrom(CopyState cstate)
2702
2710
/*
2703
2711
* Shut down FDW.
2704
2712
*/
2705
- if (resultRelInfo -> ri_FdwRoutine )
2706
- {
2707
- resultRelInfo -> ri_FdwRoutine -> EndForeignCopyFrom (
2708
- estate , resultRelInfo );
2709
- }
2713
+ EndForeignCopyFrom (estate , resultRelInfo );
2710
2714
2711
2715
/* Close all the partitioned tables, leaf partitions, and their indices */
2712
2716
if (cstate -> partition_dispatch_info )
@@ -2730,11 +2734,8 @@ CopyFrom(CopyState cstate)
2730
2734
{
2731
2735
ResultRelInfo * resultRelInfo = cstate -> partitions + i ;
2732
2736
2733
- if (resultRelInfo -> ri_FdwRoutine )
2734
- {
2735
- resultRelInfo -> ri_FdwRoutine -> EndForeignCopyFrom (
2736
- estate , resultRelInfo );
2737
- }
2737
+ EndForeignCopyFrom (estate , resultRelInfo );
2738
+
2738
2739
ExecCloseIndices (resultRelInfo );
2739
2740
heap_close (resultRelInfo -> ri_RelationDesc , NoLock );
2740
2741
}
@@ -4726,19 +4727,29 @@ CreateCopyDestReceiver(void)
4726
4727
return (DestReceiver * ) self ;
4727
4728
}
4728
4729
4730
+ /*
4731
+ * Start COPY FROM on foreign relation, if possible. If not, just do nothing.
4732
+ */
4729
4733
static void InitForeignCopyFrom (EState * estate , ResultRelInfo * resultRelInfo ,
4730
4734
CopyState cstate , char * dest_relname )
4731
4735
{
4732
- if (resultRelInfo -> ri_FdwRoutine )
4736
+ if (resultRelInfo -> ri_FdwRoutine &&
4737
+ FdwCopyFromIsSupported (resultRelInfo -> ri_FdwRoutine ))
4733
4738
{
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 ))));
4741
4739
resultRelInfo -> ri_FdwRoutine ->
4742
4740
BeginForeignCopyFrom (estate , resultRelInfo , cstate , dest_relname );
4743
4741
}
4744
4742
}
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