On 8/7/2022 05:12, Ian Barwick wrote:
    ERROR:  bind message supplies 0 parameters, but prepared statement "pgsql_fdw_prep_178" requires 6     CONTEXT:  remote SQL command: INSERT INTO public.foo_part_1(t, v1, v2, v3, v4, v5) VALUES ($1, $2, $3, $4, $5, $6)
     COPY foo, line 88160
Thanks, I got it. MultiInsertBuffer are created on the first non-zero flush of tuples into the partition and isn't deleted from the buffers list until the end of COPY. And on a subsequent flush in the case of empty buffer we catch the error. Your fix is correct, but I want to propose slightly different change (see in attachment).

--
regards,
Andrey Lepikhov
Postgres Professional
diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c
index 245a260982..203289f7f2 100644
--- a/src/backend/commands/copyfrom.c
+++ b/src/backend/commands/copyfrom.c
@@ -329,7 +329,8 @@ CopyMultiInsertBufferFlush(CopyMultiInsertInfo *miinfo,
                           
resultRelInfo->ri_FdwRoutine->GetForeignModifyBatchSize != NULL);
 
                /* Flush into foreign table or partition */
-               do {
+               while(sent < nused)
+               {
                        int size = (resultRelInfo->ri_BatchSize < nused - sent) 
?
                                                resultRelInfo->ri_BatchSize : 
(nused - sent);
                        int inserted = size;
@@ -340,7 +341,7 @@ CopyMultiInsertBufferFlush(CopyMultiInsertInfo *miinfo,
                                                                                
                                                 NULL,
                                                                                
                                                 &inserted);
                        sent += size;
-               } while (sent < nused);
+               }
        }
        else
        {

Reply via email to