/* *CREATECONVERSION
*/
ObjectAddress
CreateConversionCommand(CreateConversionStmt *stmt)
{
Oid namespaceId; char *conversion_name;
AclResult aclresult; int from_encoding; int to_encoding;
Oid funcoid; constchar *from_encoding_name = stmt->for_encoding_name; constchar *to_encoding_name = stmt->to_encoding_name;
List *func_name = stmt->func_name; staticconst Oid funcargs[] = {INT4OID, INT4OID, CSTRINGOID, INTERNALOID, INT4OID, BOOLOID}; char result[1];
Datum funcresult;
/* Convert list of names to a name and namespace */
namespaceId = QualifiedNameGetCreationNamespace(stmt->conversion_name,
&conversion_name);
/* Check we have creation rights in target namespace */
aclresult = object_aclcheck(NamespaceRelationId, namespaceId, GetUserId(), ACL_CREATE); if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, OBJECT_SCHEMA,
get_namespace_name(namespaceId));
/* Check the encoding names */
from_encoding = pg_char_to_encoding(from_encoding_name); if (from_encoding < 0)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("source encoding \"%s\" does not exist",
from_encoding_name)));
to_encoding = pg_char_to_encoding(to_encoding_name); if (to_encoding < 0)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("destination encoding \"%s\" does not exist",
to_encoding_name)));
/* *WeconsiderconversionstoorfromSQL_ASCIItobemeaningless.(If *youwishtochangethis,notethatpg_do_encoding_conversion()andits *sisterfunctionshavehard-wiredfastpathsforanyconversioninwhich *thesourceortargetencodingisSQL_ASCII,sothatanencoding *conversionfunctiondeclaredforsuchacasewillneverbeused.)
*/ if (from_encoding == PG_SQL_ASCII || to_encoding == PG_SQL_ASCII)
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg("encoding conversion to or from \"SQL_ASCII\" is not supported")));
/* Check it returns int4, else it's probably the wrong function */ if (get_func_rettype(funcoid) != INT4OID)
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg("encoding conversion function %s must return type %s",
NameListToString(func_name), "integer")));
/* Check we have EXECUTE rights for the function */
aclresult = object_aclcheck(ProcedureRelationId, funcoid, GetUserId(), ACL_EXECUTE); if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, OBJECT_FUNCTION,
NameListToString(func_name));
/* *Thefunctionshouldreturn0foremptyinput.Mightaswellcheckthat, *too.
*/ if (DatumGetInt32(funcresult) != 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg("encoding conversion function %s returned incorrect result for empty input",
NameListToString(func_name))));
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.