diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index a02b98f73d7635fe78ca37f0007c690a459cb60f..13c55d51bff26e3afc04ba673c7aa2ca2822d2a2 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.37 2009/01/01 17:23:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.38 2009/02/27 16:35:26 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -49,6 +49,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, @@ -95,6 +96,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)