From b6e73cfb1129534915af64805b16e8e371b8e004 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 27 Feb 2009 16:35:31 +0000 Subject: [PATCH] In CREATE CONVERSION, test that the given function is a valid conversion function for the specified source and destination encodings. We do that by calling the function with an empty string. If it can't perform the requested conversion, it will throw an error. Backport to 7.4 - 8.3. Per bug report #4680 by Denis Afonin. --- src/backend/commands/conversioncmds.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index 2bdb144a23..873629cf75 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -47,6 +47,7 @@ CreateConversionCommand(CreateConversionStmt *stmt) const char *to_encoding_name = stmt->to_encoding_name; List *func_name = stmt->func_name; static Oid funcargs[] = {INT4OID, INT4OID, CSTRINGOID, INTERNALOID, INT4OID}; + char result[1]; /* Convert list of names to a name and namespace */ namespaceId = QualifiedNameGetCreationNamespace(stmt->conversion_name, @@ -86,6 +87,19 @@ CreateConversionCommand(CreateConversionStmt *stmt) aclcheck_error(aclresult, ACL_KIND_PROC, NameListToString(func_name)); + /* + * Check that the conversion function is suitable for the requested + * source and target encodings. We do that by calling the function with + * an empty string; the conversion function should throw an error if it + * can't perform the requested conversion. + */ + OidFunctionCall5(funcoid, + Int32GetDatum(from_encoding), + Int32GetDatum(to_encoding), + CStringGetDatum(""), + CStringGetDatum(result), + Int32GetDatum(0)); + /* * All seem ok, go ahead (possible failure would be a duplicate conversion * name) -- 2.39.5