In COPY FROM, fail cleanly when unsupported encoding conversion is needed.
authorTom Lane <[email protected]>
Sun, 1 Oct 2023 16:09:26 +0000 (12:09 -0400)
committerTom Lane <[email protected]>
Sun, 1 Oct 2023 16:09:26 +0000 (12:09 -0400)
In recent releases, such cases fail with "cache lookup failed for
function 0" rather than complaining that the conversion function
doesn't exist as prior versions did.  Seems to be a consequence of
sloppy refactoring in commit f82de5c46.  Add the missing error check.

Per report from Pierre Fortin.  Back-patch to v14 where the
oversight crept in.

Discussion: https://postgr.es/m/20230929163739.3bea46e5[email protected]

src/backend/commands/copyfrom.c

index cf0fc9d794d44329ffe977a634d5c76be6c0713f..cec80baceaf46f8fc5d301cb84f02abd7edade46 100644 (file)
@@ -1485,6 +1485,12 @@ BeginCopyFrom(ParseState *pstate,
                cstate->need_transcoding = true;
                cstate->conversion_proc = FindDefaultConversionProc(cstate->file_encoding,
                                                                                                                        GetDatabaseEncoding());
+               if (!OidIsValid(cstate->conversion_proc))
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_UNDEFINED_FUNCTION),
+                                        errmsg("default conversion function for encoding \"%s\" to \"%s\" does not exist",
+                                                       pg_encoding_to_char(cstate->file_encoding),
+                                                       pg_encoding_to_char(GetDatabaseEncoding()))));
        }
 
        cstate->copy_src = COPY_FILE;   /* default */