mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
With the 'noError' argument, you can try to convert a buffer without knowing the character boundaries beforehand. The functions now need to return the number of input bytes successfully converted. This is is a backwards-incompatible change, if you have created a custom encoding conversion with CREATE CONVERSION. This adds a check to pg_upgrade for that, refusing the upgrade if there are any user-defined encoding conversions. Custom conversions are very rare, there are no commonly used extensions that I know of that uses that feature. No other objects can depend on conversions, so if you do have one, you can fairly easily drop it before upgrading, and recreate it after the upgrade with an updated version. Add regression tests for built-in encoding conversions. This doesn't cover every conversion, but it covers all the internal functions in conv.c that are used to implement the conversions. Reviewed-by: John Naylor Discussion: https://www.postgresql.org/message-id/e7861509-3960-538a-9025-b75a61188e01%40iki.fi
190 lines
5.2 KiB
Plaintext
190 lines
5.2 KiB
Plaintext
<!--
|
|
doc/src/sgml/ref/create_conversion.sgml
|
|
PostgreSQL documentation
|
|
-->
|
|
|
|
<refentry id="sql-createconversion">
|
|
<indexterm zone="sql-createconversion">
|
|
<primary>CREATE CONVERSION</primary>
|
|
</indexterm>
|
|
|
|
<refmeta>
|
|
<refentrytitle>CREATE CONVERSION</refentrytitle>
|
|
<manvolnum>7</manvolnum>
|
|
<refmiscinfo>SQL - Language Statements</refmiscinfo>
|
|
</refmeta>
|
|
|
|
<refnamediv>
|
|
<refname>CREATE CONVERSION</refname>
|
|
<refpurpose>define a new encoding conversion</refpurpose>
|
|
</refnamediv>
|
|
|
|
<refsynopsisdiv>
|
|
<synopsis>
|
|
CREATE [ DEFAULT ] CONVERSION <replaceable>name</replaceable>
|
|
FOR <replaceable>source_encoding</replaceable> TO <replaceable>dest_encoding</replaceable> FROM <replaceable>function_name</replaceable>
|
|
</synopsis>
|
|
</refsynopsisdiv>
|
|
|
|
<refsect1 id="sql-createconversion-description">
|
|
<title>Description</title>
|
|
|
|
<para>
|
|
<command>CREATE CONVERSION</command> defines a new conversion between
|
|
two character set encodings.
|
|
</para>
|
|
|
|
<para>
|
|
Conversions that are marked <literal>DEFAULT</literal> can be used for
|
|
automatic encoding conversion between client and server. To support that
|
|
usage, two conversions, from encoding A to B <emphasis>and</emphasis>
|
|
from encoding B to A, must be defined.
|
|
</para>
|
|
|
|
<para>
|
|
To be able to create a conversion, you must have <literal>EXECUTE</literal> privilege
|
|
on the function and <literal>CREATE</literal> privilege on the destination schema.
|
|
</para>
|
|
</refsect1>
|
|
|
|
|
|
<refsect1>
|
|
<title>Parameters</title>
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>DEFAULT</literal></term>
|
|
|
|
<listitem>
|
|
<para>
|
|
The <literal>DEFAULT</literal> clause indicates that this conversion
|
|
is the default for this particular source to destination
|
|
encoding. There should be only one default encoding in a schema
|
|
for the encoding pair.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>name</replaceable></term>
|
|
|
|
<listitem>
|
|
<para>
|
|
The name of the conversion. The conversion name can be
|
|
schema-qualified. If it is not, the conversion is defined in the
|
|
current schema. The conversion name must be unique within a
|
|
schema.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>source_encoding</replaceable></term>
|
|
|
|
<listitem>
|
|
<para>
|
|
The source encoding name.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>dest_encoding</replaceable></term>
|
|
|
|
<listitem>
|
|
<para>
|
|
The destination encoding name.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>function_name</replaceable></term>
|
|
|
|
<listitem>
|
|
<para>
|
|
The function used to perform the conversion. The function name can
|
|
be schema-qualified. If it is not, the function will be looked
|
|
up in the path.
|
|
</para>
|
|
|
|
<para>
|
|
The function must have the following signature:
|
|
|
|
<programlisting>
|
|
conv_proc(
|
|
integer, -- source encoding ID
|
|
integer, -- destination encoding ID
|
|
cstring, -- source string (null terminated C string)
|
|
internal, -- destination (fill with a null terminated C string)
|
|
integer, -- source string length
|
|
boolean -- if true, don't throw an error if conversion fails
|
|
) RETURNS integer;
|
|
</programlisting>
|
|
The return value is the number of source bytes that were successfully
|
|
converted. If the last argument is false, the function must throw an
|
|
error on invalid input, and the return value is always equal to the
|
|
source string length.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</refsect1>
|
|
|
|
<refsect1 id="sql-createconversion-notes">
|
|
<title>Notes</title>
|
|
|
|
<para>
|
|
Neither the source nor the destination encoding can
|
|
be <literal>SQL_ASCII</literal>, as the server's behavior for cases
|
|
involving the <literal>SQL_ASCII</literal> <quote>encoding</quote> is
|
|
hard-wired.
|
|
</para>
|
|
|
|
<para>
|
|
Use <command>DROP CONVERSION</command> to remove user-defined conversions.
|
|
</para>
|
|
|
|
<para>
|
|
The privileges required to create a conversion might be changed in a future
|
|
release.
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 id="sql-createconversion-examples">
|
|
<title>Examples</title>
|
|
|
|
<para>
|
|
To create a conversion from encoding <literal>UTF8</literal> to
|
|
<literal>LATIN1</literal> using <function>myfunc</function>:
|
|
<programlisting>
|
|
CREATE CONVERSION myconv FOR 'UTF8' TO 'LATIN1' FROM myfunc;
|
|
</programlisting></para>
|
|
</refsect1>
|
|
|
|
|
|
<refsect1 id="sql-createconversion-compat">
|
|
<title>Compatibility</title>
|
|
|
|
<para>
|
|
<command>CREATE CONVERSION</command>
|
|
is a <productname>PostgreSQL</productname> extension.
|
|
There is no <command>CREATE CONVERSION</command>
|
|
statement in the SQL standard, but a <command>CREATE TRANSLATION</command>
|
|
statement that is very similar in purpose and syntax.
|
|
</para>
|
|
</refsect1>
|
|
|
|
|
|
<refsect1 id="sql-createconversion-seealso">
|
|
<title>See Also</title>
|
|
|
|
<simplelist type="inline">
|
|
<member><xref linkend="sql-alterconversion"/></member>
|
|
<member><xref linkend="sql-createfunction"/></member>
|
|
<member><xref linkend="sql-dropconversion"/></member>
|
|
</simplelist>
|
|
</refsect1>
|
|
|
|
</refentry>
|