Skip to content

Commit 1950fab

Browse files
committed
Disable COPY FROM to foreign parts, because no generic impl exists.
1 parent d45843e commit 1950fab

File tree

3 files changed

+27
-42
lines changed

3 files changed

+27
-42
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: FDW adapter for relation "p1" doesn't support COPY FROM
318+
ERROR: cannot route inserted tuples to a foreign table
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: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,6 @@ static void CopySendInt32(CopyState cstate, int32 val);
180180
static bool CopyGetInt32(CopyState cstate, int32 *val);
181181
static void CopySendInt16(CopyState cstate, int16 val);
182182
static bool CopyGetInt16(CopyState cstate, int16 *val);
183-
static void InitForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo,
184-
CopyState cstate, char *dest_relname);
185-
static void EndForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo);
186183

187184

188185
/*
@@ -2314,7 +2311,6 @@ CopyFrom(CopyState cstate)
23142311
TupleTableSlot *partition_tuple_slot;
23152312
int num_parted,
23162313
num_partitions;
2317-
int i;
23182314

23192315
ExecSetupPartitionTupleRouting(cstate->rel,
23202316
1,
@@ -2351,16 +2347,15 @@ CopyFrom(CopyState cstate)
23512347
gettext_noop("could not convert row type"));
23522348
}
23532349
}
2354-
2355-
/* If some partitions are foreign tables, init copy on remote end */
2356-
for (i = 0; i < num_partitions; i++)
2357-
{
2358-
InitForeignCopyFrom(estate, partitions + i, cstate, NULL);
2359-
}
23602350
}
23612351

23622352
/* If we are copying to foreign table, init it */
2363-
InitForeignCopyFrom(estate, resultRelInfo, cstate, NULL);
2353+
if (resultRelInfo->ri_FdwRoutine &&
2354+
FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
2355+
{
2356+
resultRelInfo->ri_FdwRoutine->
2357+
BeginForeignCopyFrom(estate, resultRelInfo, cstate, NULL);
2358+
}
23642359

23652360
/*
23662361
* It's more efficient to prepare a bunch of tuples for insertion, and
@@ -2490,6 +2485,12 @@ CopyFrom(CopyState cstate)
24902485
saved_resultRelInfo = resultRelInfo;
24912486
resultRelInfo = cstate->partitions + leaf_part_index;
24922487

2488+
/* We do not yet have a way to insert into a foreign partition */
2489+
if (resultRelInfo->ri_FdwRoutine)
2490+
ereport(ERROR,
2491+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2492+
errmsg("cannot route inserted tuples to a foreign table")));
2493+
24932494
/*
24942495
* For ExecInsertIndexTuples() to work on the partition's indexes
24952496
*/
@@ -2710,7 +2711,12 @@ CopyFrom(CopyState cstate)
27102711
/*
27112712
* Shut down FDW.
27122713
*/
2713-
EndForeignCopyFrom(estate, resultRelInfo);
2714+
if (resultRelInfo->ri_FdwRoutine &&
2715+
FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
2716+
{
2717+
resultRelInfo->ri_FdwRoutine->EndForeignCopyFrom(
2718+
estate, resultRelInfo);
2719+
}
27142720

27152721
/* Close all the partitioned tables, leaf partitions, and their indices */
27162722
if (cstate->partition_dispatch_info)
@@ -2734,8 +2740,6 @@ CopyFrom(CopyState cstate)
27342740
{
27352741
ResultRelInfo *resultRelInfo = cstate->partitions + i;
27362742

2737-
EndForeignCopyFrom(estate, resultRelInfo);
2738-
27392743
ExecCloseIndices(resultRelInfo);
27402744
heap_close(resultRelInfo->ri_RelationDesc, NoLock);
27412745
}
@@ -4726,30 +4730,3 @@ CreateCopyDestReceiver(void)
47264730

47274731
return (DestReceiver *) self;
47284732
}
4729-
4730-
/*
4731-
* Start COPY FROM on foreign relation, if possible. If not, just do nothing.
4732-
*/
4733-
static void InitForeignCopyFrom(EState *estate, ResultRelInfo *resultRelInfo,
4734-
CopyState cstate, char *dest_relname)
4735-
{
4736-
if (resultRelInfo->ri_FdwRoutine &&
4737-
FdwCopyFromIsSupported(resultRelInfo->ri_FdwRoutine))
4738-
{
4739-
resultRelInfo->ri_FdwRoutine->
4740-
BeginForeignCopyFrom(estate, resultRelInfo, cstate, dest_relname);
4741-
}
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-
}

src/include/foreign/fdwapi.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ typedef bool (*IsForeignScanParallelSafe_function) (PlannerInfo *root,
160160
RelOptInfo *rel,
161161
RangeTblEntry *rte);
162162

163+
/*
164+
* These functions are not documented in fdwhandler.sgml because the interface
165+
* is pretty unstable and weird, it hardly would be useful for anyone but
166+
* shardman. In particular,
167+
* - There is no way to COPY binary data.
168+
* - Private CopyState is exported.
169+
* - I am not sure about passing parent_rinfo.
170+
*/
163171
typedef void (*BeginForeignCopyFrom_function) (EState *estate,
164172
ResultRelInfo *rinfo,
165173
CopyState cstate,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy