diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml
index 4356e6d01e6a7a626cf5de4d6c79b37a4bcfa695..a4093a2382f5658c3852bec57e69622704386d24 100644
--- a/doc/src/sgml/charset.sgml
+++ b/doc/src/sgml/charset.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/charset.sgml,v 2.26 2002/08/08 08:21:52 ishii Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/charset.sgml,v 2.27 2002/08/14 02:45:09 ishii Exp $ -->
 
 <chapter id="charset">
  <title>Localization</>
@@ -649,8 +649,7 @@ $ <userinput>psql -l</userinput>
 	</row>
 	<row>  
 	 <entry><literal>LATIN5</literal></entry>
-	 <entry><literal>LATIN5</literal>, <literal>UNICODE</literal>,
-	 <literal>MULE_INTERNAL</literal>
+	 <entry><literal>LATIN5</literal>, <literal>UNICODE</literal>
 	 </entry>
 	</row>
 	<row>  
@@ -687,6 +686,7 @@ $ <userinput>psql -l</userinput>
 	 <entry><literal>ISO_8859_5</literal></entry>
 	 <entry><literal>ISO_8859_5</literal>,
 	 <literal>UNICODE</literal>,
+	 <literal>MULE_INTERNAL</literal>,
 	 <literal>WIN</literal>,
 	 <literal>ALT</literal>,
 	 <literal>KOI8</literal>
@@ -727,13 +727,17 @@ $ <userinput>psql -l</userinput>
 	 <literal>WIN1256</literal>,
 	 <literal>TCVN</literal>,
 	 <literal>WIN874</literal>,
+	 <literal>GB18030</literal>,
+	 <literal>WIN1250</literal>
 	 </entry>
 	</row>
 	<row>
 	 <entry><literal>MULE_INTERNAL</literal></entry>
 	 <entry><literal>EUC_JP</literal>, <literal>SJIS</literal>, <literal>EUC_KR</literal>, <literal>EUC_CN</literal>, 
 	  <literal>EUC_TW</literal>, <literal>BIG5</literal>, <literal>LATIN1</literal> to <literal>LATIN5</literal>, 
-	  <literal>WIN</literal>, <literal>ALT</literal>, <literal>WIN1250</literal></entry>
+	  <literal>WIN</literal>, <literal>ALT</literal>,
+	 <literal>WIN1250</literal>,
+	  <literal>BIG5</literal>, <literal>ISO_8859_5</literal>, <literal>KOI8</literal></entry>
 	</row>
 	<row>
 	 <entry><literal>KOI8</literal></entry>
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 475af47464973861b7cd7d9594004cf5bc95dcef..f136088fe84ea2253c6f013c0aaffb52852ed6be 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/func.sgml,v 1.110 2002/08/09 16:45:13 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/func.sgml,v 1.111 2002/08/14 02:45:09 ishii Exp $
 PostgreSQL documentation
 -->
 
@@ -970,9 +970,16 @@ PostgreSQL documentation
        <entry>destination encoding</entry>
       </row>
      </thead>
+
      <tbody>
       <row>
-       <entry>ascii_to_utf8</entry>
+       <entry>ascii_to_mic</entry>
+       <entry>SQL_ASCII</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>ascii_to_utf_8</entry>
        <entry>SQL_ASCII</entry>
        <entry>UNICODE</entry>
       </row>
@@ -990,13 +997,19 @@ PostgreSQL documentation
       </row>
 
       <row>
-       <entry>big5_to_utf8</entry>
+       <entry>big5_to_utf_8</entry>
        <entry>BIG5</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>euc_cn_to_utf8</entry>
+       <entry>euc_cn_to_mic</entry>
+       <entry>EUC_CN</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>euc_cn_to_utf_8</entry>
        <entry>EUC_CN</entry>
        <entry>UNICODE</entry>
       </row>
@@ -1014,13 +1027,19 @@ PostgreSQL documentation
       </row>
 
       <row>
-       <entry>euc_jp_to_utf8</entry>
+       <entry>euc_jp_to_utf_8</entry>
        <entry>EUC_JP</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>euc_kr_to_utf8</entry>
+       <entry>euc_kr_to_mic</entry>
+       <entry>EUC_KR</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>euc_kr_to_utf_8</entry>
        <entry>EUC_KR</entry>
        <entry>UNICODE</entry>
       </row>
@@ -1038,137 +1057,293 @@ PostgreSQL documentation
       </row>
 
       <row>
-       <entry>euc_tw_to_utf8</entry>
+       <entry>euc_tw_to_utf_8</entry>
        <entry>EUC_TW</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>gb18030_to_utf8</entry>
+       <entry>gb18030_to_utf_8</entry>
        <entry>GB18030</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>gbk_to_utf8</entry>
+       <entry>gbk_to_utf_8</entry>
        <entry>GBK</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_10_to_utf8</entry>
+       <entry>iso_8859_10_to_utf_8</entry>
        <entry>LATIN6</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_13_to_utf8</entry>
+       <entry>iso_8859_13_to_utf_8</entry>
        <entry>LATIN7</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_14_to_utf8</entry>
+       <entry>iso_8859_14_to_utf_8</entry>
        <entry>LATIN8</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_15_to_utf8</entry>
+       <entry>iso_8859_15_to_utf_8</entry>
        <entry>LATIN9</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_16_to_utf8</entry>
+       <entry>iso_8859_16_to_utf_8</entry>
        <entry>LATIN10</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_1_to_utf8</entry>
+       <entry>iso_8859_1_to_mic</entry>
+       <entry>LATIN1</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_1_to_utf_8</entry>
        <entry>LATIN1</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_2_to_utf8</entry>
+       <entry>iso_8859_2_to_mic</entry>
+       <entry>LATIN2</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_2_to_utf_8</entry>
        <entry>LATIN2</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_3_to_utf8</entry>
+       <entry>iso_8859_2_to_win1250</entry>
+       <entry>LATIN2</entry>
+       <entry>WIN1250</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_3_to_mic</entry>
+       <entry>LATIN3</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_3_to_utf_8</entry>
        <entry>LATIN3</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_4_to_utf8</entry>
+       <entry>iso_8859_4_to_mic</entry>
+       <entry>LATIN4</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_4_to_utf_8</entry>
        <entry>LATIN4</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_5_to_utf8</entry>
+       <entry>iso_8859_5_to_koi8r</entry>
+       <entry>ISO_8859_5</entry>
+       <entry>KOI8</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_5_to_mic</entry>
+       <entry>ISO_8859_5</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_5_to_utf_8</entry>
        <entry>ISO_8859_5</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_6_to_utf8</entry>
+       <entry>iso_8859_5_to_win1251</entry>
+       <entry>ISO_8859_5</entry>
+       <entry>WIN</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_5_to_win866</entry>
+       <entry>ISO_8859_5</entry>
+       <entry>ALT</entry>
+      </row>
+
+      <row>
+       <entry>iso_8859_6_to_utf_8</entry>
        <entry>ISO_8859_6</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_7_to_utf8</entry>
+       <entry>iso_8859_7_to_utf_8</entry>
        <entry>ISO_8859_7</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_8_to_utf8</entry>
+       <entry>iso_8859_8_to_utf_8</entry>
        <entry>ISO_8859_8</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>iso8859_9_to_utf8</entry>
+       <entry>iso_8859_9_to_utf_8</entry>
        <entry>LATIN5</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>johab_to_utf8</entry>
+       <entry>johab_to_utf_8</entry>
        <entry>JOHAB</entry>
        <entry>UNICODE</entry>
       </row>
 
+      <row>
+       <entry>koi8r_to_iso_8859_5</entry>
+       <entry>KOI8</entry>
+       <entry>ISO_8859_5</entry>
+      </row>
+
+      <row>
+       <entry>koi8r_to_mic</entry>
+       <entry>KOI8</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>koi8r_to_utf_8</entry>
+       <entry>KOI8</entry>
+       <entry>UNICODE</entry>
+      </row>
+
+      <row>
+       <entry>koi8r_to_win1251</entry>
+       <entry>KOI8</entry>
+       <entry>WIN</entry>
+      </row>
+
+      <row>
+       <entry>koi8r_to_win866</entry>
+       <entry>KOI8</entry>
+       <entry>ALT</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_ascii</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>SQL_ASCII</entry>
+      </row>
+
       <row>
        <entry>mic_to_big5</entry>
        <entry>MULE_INTERNAL</entry>
        <entry>BIG5</entry>
       </row>
 
+      <row>
+       <entry>mic_to_euc_cn</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>EUC_CN</entry>
+      </row>
+
       <row>
        <entry>mic_to_euc_jp</entry>
        <entry>MULE_INTERNAL</entry>
        <entry>EUC_JP</entry>
       </row>
 
+      <row>
+       <entry>mic_to_euc_kr</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>EUC_KR</entry>
+      </row>
+
       <row>
        <entry>mic_to_euc_tw</entry>
        <entry>MULE_INTERNAL</entry>
        <entry>EUC_TW</entry>
       </row>
 
+      <row>
+       <entry>mic_to_iso_8859_1</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>LATIN1</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_iso_8859_2</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>LATIN2</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_iso_8859_3</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>LATIN3</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_iso_8859_4</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>LATIN4</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_iso_8859_5</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>ISO_8859_5</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_koi8r</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>KOI8</entry>
+      </row>
+
       <row>
        <entry>mic_to_sjis</entry>
        <entry>MULE_INTERNAL</entry>
        <entry>SJIS</entry>
       </row>
 
+      <row>
+       <entry>mic_to_win1250</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>WIN1250</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_win1251</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>WIN</entry>
+      </row>
+
+      <row>
+       <entry>mic_to_win866</entry>
+       <entry>MULE_INTERNAL</entry>
+       <entry>ALT</entry>
+      </row>
+
       <row>
        <entry>sjis_to_euc_jp</entry>
        <entry>SJIS</entry>
@@ -1182,179 +1357,305 @@ PostgreSQL documentation
       </row>
 
       <row>
-       <entry>sjis_to_utf8</entry>
+       <entry>sjis_to_utf_8</entry>
        <entry>SJIS</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>tcvn_to_utf8</entry>
+       <entry>tcvn_to_utf_8</entry>
        <entry>TCVN</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>uhc_to_utf8</entry>
+       <entry>uhc_to_utf_8</entry>
        <entry>UHC</entry>
        <entry>UNICODE</entry>
       </row>
 
       <row>
-       <entry>utf8_to_ascii</entry>
+       <entry>utf_8_to_ascii</entry>
        <entry>UNICODE</entry>
        <entry>SQL_ASCII</entry>
       </row>
 
       <row>
-       <entry>utf8_to_big5</entry>
+       <entry>utf_8_to_big5</entry>
        <entry>UNICODE</entry>
        <entry>BIG5</entry>
       </row>
 
       <row>
-       <entry>utf8_to_euc_cn</entry>
+       <entry>utf_8_to_euc_cn</entry>
        <entry>UNICODE</entry>
        <entry>EUC_CN</entry>
       </row>
 
       <row>
-       <entry>utf8_to_euc_jp</entry>
+       <entry>utf_8_to_euc_jp</entry>
        <entry>UNICODE</entry>
        <entry>EUC_JP</entry>
       </row>
 
       <row>
-       <entry>utf8_to_euc_kr</entry>
+       <entry>utf_8_to_euc_kr</entry>
        <entry>UNICODE</entry>
        <entry>EUC_KR</entry>
       </row>
 
       <row>
-       <entry>utf8_to_euc_tw</entry>
+       <entry>utf_8_to_euc_tw</entry>
        <entry>UNICODE</entry>
        <entry>EUC_TW</entry>
       </row>
 
       <row>
-       <entry>utf8_to_gb18030</entry>
+       <entry>utf_8_to_gb18030</entry>
        <entry>UNICODE</entry>
        <entry>GB18030</entry>
       </row>
 
       <row>
-       <entry>utf8_to_gbk</entry>
+       <entry>utf_8_to_gbk</entry>
        <entry>UNICODE</entry>
        <entry>GBK</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_1</entry>
+       <entry>utf_8_to_iso_8859_1</entry>
        <entry>UNICODE</entry>
        <entry>LATIN1</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_10</entry>
+       <entry>utf_8_to_iso_8859_10</entry>
        <entry>UNICODE</entry>
        <entry>LATIN6</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_13</entry>
+       <entry>utf_8_to_iso_8859_13</entry>
        <entry>UNICODE</entry>
        <entry>LATIN7</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_14</entry>
+       <entry>utf_8_to_iso_8859_14</entry>
        <entry>UNICODE</entry>
        <entry>LATIN8</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_15</entry>
+       <entry>utf_8_to_iso_8859_15</entry>
        <entry>UNICODE</entry>
        <entry>LATIN9</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_16</entry>
+       <entry>utf_8_to_iso_8859_16</entry>
        <entry>UNICODE</entry>
        <entry>LATIN10</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_2</entry>
+       <entry>utf_8_to_iso_8859_2</entry>
        <entry>UNICODE</entry>
        <entry>LATIN2</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_3</entry>
+       <entry>utf_8_to_iso_8859_3</entry>
        <entry>UNICODE</entry>
        <entry>LATIN3</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_4</entry>
+       <entry>utf_8_to_iso_8859_4</entry>
        <entry>UNICODE</entry>
        <entry>LATIN4</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_5</entry>
+       <entry>utf_8_to_iso_8859_5</entry>
        <entry>UNICODE</entry>
        <entry>ISO_8859_5</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_6</entry>
+       <entry>utf_8_to_iso_8859_6</entry>
        <entry>UNICODE</entry>
        <entry>ISO_8859_6</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_7</entry>
+       <entry>utf_8_to_iso_8859_7</entry>
        <entry>UNICODE</entry>
        <entry>ISO_8859_7</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_8</entry>
+       <entry>utf_8_to_iso_8859_8</entry>
        <entry>UNICODE</entry>
        <entry>ISO_8859_8</entry>
       </row>
 
       <row>
-       <entry>utf8_to_iso8859_9</entry>
+       <entry>utf_8_to_iso_8859_9</entry>
        <entry>UNICODE</entry>
        <entry>LATIN5</entry>
       </row>
 
       <row>
-       <entry>utf8_to_johab</entry>
+       <entry>utf_8_to_johab</entry>
        <entry>UNICODE</entry>
        <entry>JOHAB</entry>
       </row>
 
       <row>
-       <entry>utf8_to_sjis</entry>
+       <entry>utf_8_to_koi8r</entry>
+       <entry>UNICODE</entry>
+       <entry>KOI8</entry>
+      </row>
+
+      <row>
+       <entry>utf_8_to_sjis</entry>
        <entry>UNICODE</entry>
        <entry>SJIS</entry>
       </row>
 
       <row>
-       <entry>utf8_to_tcvn</entry>
+       <entry>utf_8_to_tcvn</entry>
        <entry>UNICODE</entry>
        <entry>TCVN</entry>
       </row>
 
       <row>
-       <entry>utf8_to_uhc</entry>
+       <entry>utf_8_to_uhc</entry>
        <entry>UNICODE</entry>
        <entry>UHC</entry>
       </row>
 
+      <row>
+       <entry>utf_8_to_win1250</entry>
+       <entry>UNICODE</entry>
+       <entry>WIN1250</entry>
+      </row>
+
+      <row>
+       <entry>utf_8_to_win1251</entry>
+       <entry>UNICODE</entry>
+       <entry>WIN</entry>
+      </row>
+
+      <row>
+       <entry>utf_8_to_win1256</entry>
+       <entry>UNICODE</entry>
+       <entry>WIN1256</entry>
+      </row>
+
+      <row>
+       <entry>utf_8_to_win866</entry>
+       <entry>UNICODE</entry>
+       <entry>ALT</entry>
+      </row>
+
+      <row>
+       <entry>utf_8_to_win874</entry>
+       <entry>UNICODE</entry>
+       <entry>WIN874</entry>
+      </row>
+
+      <row>
+       <entry>win1250_to_iso_8859_2</entry>
+       <entry>WIN1250</entry>
+       <entry>LATIN2</entry>
+      </row>
+
+      <row>
+       <entry>win1250_to_mic</entry>
+       <entry>WIN1250</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>win1250_to_utf_8</entry>
+       <entry>WIN1250</entry>
+       <entry>UNICODE</entry>
+      </row>
+
+      <row>
+       <entry>win1251_to_iso_8859_5</entry>
+       <entry>WIN</entry>
+       <entry>ISO_8859_5</entry>
+      </row>
+
+      <row>
+       <entry>win1251_to_koi8r</entry>
+       <entry>WIN</entry>
+       <entry>KOI8</entry>
+      </row>
+
+      <row>
+       <entry>win1251_to_mic</entry>
+       <entry>WIN</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>win1251_to_utf_8</entry>
+       <entry>WIN</entry>
+       <entry>UNICODE</entry>
+      </row>
+
+      <row>
+       <entry>win1251_to_win866</entry>
+       <entry>WIN</entry>
+       <entry>ALT</entry>
+      </row>
+
+      <row>
+       <entry>win1256_to_utf_8</entry>
+       <entry>WIN1256</entry>
+       <entry>UNICODE</entry>
+      </row>
+
+      <row>
+       <entry>win866_to_iso_8859_5</entry>
+       <entry>ALT</entry>
+       <entry>ISO_8859_5</entry>
+      </row>
+
+      <row>
+       <entry>win866_to_koi8r</entry>
+       <entry>ALT</entry>
+       <entry>KOI8</entry>
+      </row>
+
+      <row>
+       <entry>win866_to_mic</entry>
+       <entry>ALT</entry>
+       <entry>MULE_INTERNAL</entry>
+      </row>
+
+      <row>
+       <entry>win866_to_utf_8</entry>
+       <entry>ALT</entry>
+       <entry>UNICODE</entry>
+      </row>
+
+      <row>
+       <entry>win866_to_win1251</entry>
+       <entry>ALT</entry>
+       <entry>WIN</entry>
+      </row>
+
+      <row>
+       <entry>win874_to_utf_8</entry>
+       <entry>WIN874</entry>
+       <entry>UNICODE</entry>
+      </row>
+
      </tbody>
     </tgroup>
    </table>
diff --git a/src/backend/utils/mb/conv.c b/src/backend/utils/mb/conv.c
index e77167632771634585f3558e82480ee773010489..98b6b27db855f77d65586bde4407d4699b3c83b8 100644
--- a/src/backend/utils/mb/conv.c
+++ b/src/backend/utils/mb/conv.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conv.c,v 1.41 2002/07/19 11:09:25 ishii Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conv.c,v 1.42 2002/08/14 02:45:10 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -34,117 +34,6 @@ pg_print_bogus_char(unsigned char **mic, unsigned char **p)
 }
 
 #ifdef NOT_USED
-/*
- * EUC_KR ---> MIC
- */
-static void
-euc_kr2mic(unsigned char *euc, unsigned char *p, int len)
-{
-	int			c1;
-
-	while (len > 0 && (c1 = *euc++))
-	{
-		if (c1 & 0x80)
-		{
-			len -= 2;
-			*p++ = LC_KS5601;
-			*p++ = c1;
-			*p++ = *euc++;
-		}
-		else
-		{						/* should be ASCII */
-			len--;
-			*p++ = c1;
-		}
-	}
-	*p = '\0';
-}
-
-/*
- * MIC ---> EUC_KR
- */
-static void
-mic2euc_kr(unsigned char *mic, unsigned char *p, int len)
-{
-	int			c1;
-
-	while (len > 0 && (c1 = *mic))
-	{
-		len -= pg_mic_mblen(mic++);
-
-		if (c1 == LC_KS5601)
-		{
-			*p++ = *mic++;
-			*p++ = *mic++;
-		}
-		else if (c1 > 0x7f)
-		{						/* cannot convert to EUC_KR! */
-			mic--;
-			pg_print_bogus_char(&mic, &p);
-		}
-		else
-		{						/* should be ASCII */
-			*p++ = c1;
-		}
-	}
-	*p = '\0';
-}
-
-/*
- * EUC_CN ---> MIC
- */
-static void
-euc_cn2mic(unsigned char *euc, unsigned char *p, int len)
-{
-	int			c1;
-
-	while (len > 0 && (c1 = *euc++))
-	{
-		if (c1 & 0x80)
-		{
-			len -= 2;
-			*p++ = LC_GB2312_80;
-			*p++ = c1;
-			*p++ = *euc++;
-		}
-		else
-		{						/* should be ASCII */
-			len--;
-			*p++ = c1;
-		}
-	}
-	*p = '\0';
-}
-
-/*
- * MIC ---> EUC_CN
- */
-static void
-mic2euc_cn(unsigned char *mic, unsigned char *p, int len)
-{
-	int			c1;
-
-	while (len > 0 && (c1 = *mic))
-	{
-		len -= pg_mic_mblen(mic++);
-
-		if (c1 == LC_GB2312_80)
-		{
-			*p++ = *mic++;
-			*p++ = *mic++;
-		}
-		else if (c1 > 0x7f)
-		{						/* cannot convert to EUC_CN! */
-			mic--;
-			pg_print_bogus_char(&mic, &p);
-		}
-		else
-		{						/* should be ASCII */
-			*p++ = c1;
-		}
-	}
-	*p = '\0';
-}
 
 /*
  * GB18030 ---> MIC
@@ -236,10 +125,12 @@ mic2gb18030(unsigned char *mic, unsigned char *p, int len)
 	*p = '\0';
 }
 
+#endif
+
 /*
  * LATINn ---> MIC
  */
-static void
+void
 latin2mic(unsigned char *l, unsigned char *p, int len, int lc)
 {
 	int			c1;
@@ -258,7 +149,7 @@ latin2mic(unsigned char *l, unsigned char *p, int len, int lc)
 /*
  * MIC ---> LATINn
  */
-static void
+void
 mic2latin(unsigned char *mic, unsigned char *p, int len, int lc)
 {
 	int			c1;
@@ -282,47 +173,6 @@ mic2latin(unsigned char *mic, unsigned char *p, int len, int lc)
 	*p = '\0';
 }
 
-static void
-latin12mic(unsigned char *l, unsigned char *p, int len)
-{
-	latin2mic(l, p, len, LC_ISO8859_1);
-}
-static void
-mic2latin1(unsigned char *mic, unsigned char *p, int len)
-{
-	mic2latin(mic, p, len, LC_ISO8859_1);
-}
-static void
-latin22mic(unsigned char *l, unsigned char *p, int len)
-{
-	latin2mic(l, p, len, LC_ISO8859_2);
-}
-static void
-mic2latin2(unsigned char *mic, unsigned char *p, int len)
-{
-	mic2latin(mic, p, len, LC_ISO8859_2);
-}
-static void
-latin32mic(unsigned char *l, unsigned char *p, int len)
-{
-	latin2mic(l, p, len, LC_ISO8859_3);
-}
-static void
-mic2latin3(unsigned char *mic, unsigned char *p, int len)
-{
-	mic2latin(mic, p, len, LC_ISO8859_3);
-}
-static void
-latin42mic(unsigned char *l, unsigned char *p, int len)
-{
-	latin2mic(l, p, len, LC_ISO8859_4);
-}
-static void
-mic2latin4(unsigned char *mic, unsigned char *p, int len)
-{
-	mic2latin(mic, p, len, LC_ISO8859_4);
-}
-#endif
 
 /*
  * ASCII ---> MIC
@@ -358,32 +208,6 @@ pg_mic2ascii(unsigned char *mic, unsigned char *p, int len)
 	*p = '\0';
 }
 
-#ifdef NOT_USED
-/*
- * Cyrillic support
- * currently supported Cyrillic encodings:
- *
- * KOI8-R (this is the charset for the mule internal code
- *		for Cyrillic)
- * ISO-8859-5
- * Microsoft's CP1251(windows-1251)
- * Alternativny Variant (MS-DOS CP866)
- */
-
-/* koi8r2mic: KOI8-R to Mule internal code */
-static void
-koi8r2mic(unsigned char *l, unsigned char *p, int len)
-{
-	latin2mic(l, p, len, LC_KOI8_R);
-}
-
-/* mic2koi8r: Mule internal code to KOI8-R */
-static void
-mic2koi8r(unsigned char *mic, unsigned char *p, int len)
-{
-	mic2latin(mic, p, len, LC_KOI8_R);
-}
-
 /*
  * latin2mic_with_table: a generic single byte charset encoding
  * conversion from a local charset to the mule internal code.
@@ -392,7 +216,7 @@ mic2koi8r(unsigned char *mic, unsigned char *p, int len)
  * starting from 128 (0x80). each entry in the table
  * holds the corresponding code point for the mule internal code.
  */
-static void
+void
 latin2mic_with_table(
 					 unsigned char *l,	/* local charset string (source) */
 					 unsigned char *p,	/* pointer to store mule internal
@@ -435,7 +259,7 @@ latin2mic_with_table(
  * each entry in the table
  * holds the corresponding code point for the local code.
  */
-static void
+void
 mic2latin_with_table(
 					 unsigned char *mic,		/* mule internal code
 												 * (source) */
@@ -473,221 +297,6 @@ mic2latin_with_table(
 	*p = '\0';
 }
 
-/* iso2mic: ISO-8859-5 to Mule internal code */
-static void
-iso2mic(unsigned char *l, unsigned char *p, int len)
-{
-	static unsigned char iso2koi[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
-		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
-		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
-		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
-		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
-		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
-		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
-		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-	};
-
-	latin2mic_with_table(l, p, len, LC_KOI8_R, iso2koi);
-}
-
-/* mic2iso: Mule internal code to ISO8859-5 */
-static void
-mic2iso(unsigned char *mic, unsigned char *p, int len)
-{
-	static unsigned char koi2iso[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0xee, 0xd0, 0xd1, 0xe6, 0xd4, 0xd5, 0xe4, 0xd3,
-		0xe5, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
-		0xdf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xd6, 0xd2,
-		0xec, 0xeb, 0xd7, 0xe8, 0xed, 0xe9, 0xe7, 0xea,
-		0xce, 0xb0, 0xb1, 0xc6, 0xb4, 0xb5, 0xc4, 0xb3,
-		0xc5, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
-		0xbf, 0xcf, 0xc0, 0xc1, 0xc2, 0xc3, 0xb6, 0xb2,
-		0xcc, 0xcb, 0xb7, 0xc8, 0xcd, 0xc9, 0xc7, 0xca
-	};
-
-	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2iso);
-}
-
-/* win2mic: CP1251 to Mule internal code */
-static void
-win12512mic(unsigned char *l, unsigned char *p, int len)
-{
-	static unsigned char win2koi[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
-		0xb3, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xb7,
-		0x00, 0x00, 0xb6, 0xa6, 0xad, 0x00, 0x00, 0x00,
-		0xa3, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xa7,
-		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
-		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
-		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
-		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
-		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
-		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
-		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
-		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1
-	};
-
-	latin2mic_with_table(l, p, len, LC_KOI8_R, win2koi);
-}
-
-/* mic2win: Mule internal code to CP1251 */
-static void
-mic2win1251(unsigned char *mic, unsigned char *p, int len)
-{
-	static unsigned char koi2win[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xb8, 0xba, 0x00, 0xb3, 0xbf,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xa8, 0xaa, 0x00, 0xb2, 0xaf,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00,
-		0xfe, 0xe0, 0xe1, 0xf6, 0xe4, 0xe5, 0xf4, 0xe3,
-		0xf5, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,
-		0xef, 0xff, 0xf0, 0xf1, 0xf2, 0xf3, 0xe6, 0xe2,
-		0xfc, 0xfb, 0xe7, 0xf8, 0xfd, 0xf9, 0xf7, 0xfa,
-		0xde, 0xc0, 0xc1, 0xd6, 0xc4, 0xc5, 0xd4, 0xc3,
-		0xd5, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
-		0xcf, 0xdf, 0xd0, 0xd1, 0xd2, 0xd3, 0xc6, 0xc2,
-		0xdc, 0xdb, 0xc7, 0xd8, 0xdd, 0xd9, 0xd7, 0xda
-	};
-
-	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2win);
-}
-
-/* alt2mic: CP866 to Mule internal code */
-static void
-alt2mic(unsigned char *l, unsigned char *p, int len)
-{
-	static unsigned char alt2koi[] = {
-		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
-		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
-		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
-		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
-		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
-		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
-		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1,
-		0xb3, 0xa3, 0xb4, 0xa4, 0xb7, 0xa7, 0x00, 0x00,
-		0xb6, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-	};
-
-	latin2mic_with_table(l, p, len, LC_KOI8_R, alt2koi);
-}
-
-/* mic2alt: Mule internal code to CP866 */
-static void
-mic2alt(unsigned char *mic, unsigned char *p, int len)
-{
-	static unsigned char koi2alt[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xf1, 0xf3, 0x00, 0xf9, 0xf5,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xf0, 0xf2, 0x00, 0xf8, 0xf4,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
-		0xee, 0xa0, 0xa1, 0xe6, 0xa4, 0xa5, 0xe4, 0xa3,
-		0xe5, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
-		0xaf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xa6, 0xa2,
-		0xec, 0xeb, 0xa7, 0xe8, 0xed, 0xe9, 0xe7, 0xea,
-		0x9e, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83,
-		0x95, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
-		0x8f, 0x9f, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82,
-		0x9c, 0x9b, 0x87, 0x98, 0x9d, 0x99, 0x97, 0x9a
-	};
-
-	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2alt);
-}
-
-/*
- * end of Cyrillic support
- */
-
-
-/*-----------------------------------------------------------------
- * WIN1250
- * Microsoft's CP1250(windows-1250)
- *-----------------------------------------------------------------*/
-static void
-win12502mic(unsigned char *l, unsigned char *p, int len)
-{
-	static unsigned char win1250_2_iso88592[] = {
-		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-		0x88, 0x89, 0xA9, 0x8B, 0xA6, 0xAB, 0xAE, 0xAC,
-		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-		0x98, 0x99, 0xB9, 0x9B, 0xB6, 0xBB, 0xBE, 0xBC,
-		0xA0, 0xB7, 0xA2, 0xA3, 0xA4, 0xA1, 0x00, 0xA7,
-		0xA8, 0x00, 0xAA, 0x00, 0x00, 0xAD, 0x00, 0xAF,
-		0xB0, 0x00, 0xB2, 0xB3, 0xB4, 0x00, 0x00, 0x00,
-		0xB8, 0xB1, 0xBA, 0x00, 0xA5, 0xBD, 0xB5, 0xBF,
-		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-		0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-		0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-		0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-		0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-		0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-		0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-	};
-
-	latin2mic_with_table(l, p, len, LC_ISO8859_2, win1250_2_iso88592);
-}
-static void
-mic2win1250(unsigned char *mic, unsigned char *p, int len)
-{
-	static unsigned char iso88592_2_win1250[] = {
-		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-		0x88, 0x89, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00,
-		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-		0x98, 0x99, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x00,
-		0xA0, 0xA5, 0xA2, 0xA3, 0xA4, 0xBC, 0x8C, 0xA7,
-		0xA8, 0x8A, 0xAA, 0x8D, 0x8F, 0xAD, 0x8E, 0xAF,
-		0xB0, 0xB9, 0xB2, 0xB3, 0xB4, 0xBE, 0x9C, 0xA1,
-		0xB8, 0x9A, 0xBA, 0x9D, 0x9F, 0xBD, 0x9E, 0xBF,
-		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-		0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-		0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-		0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-		0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-		0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-		0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-	};
-
-	mic2latin_with_table(mic, p, len, LC_ISO8859_2, iso88592_2_win1250);
-}
-#endif
-
 /*
  * comparison routine for bsearch()
  * this routine is intended for UTF-8 -> local code
@@ -758,7 +367,7 @@ UtfToLocal(unsigned char *utf, unsigned char *iso,
 					sizeof(pg_utf_to_local), compare1);
 		if (p == NULL)
 		{
-			elog(WARNING, "utf_to_local: could not convert UTF-8 (0x%04x). Ignored", iutf);
+			elog(WARNING, "UtfToLocal: could not convert UTF-8 (0x%04x). Ignored", iutf);
 			continue;
 		}
 		if (p->code & 0xff000000)
@@ -773,43 +382,6 @@ UtfToLocal(unsigned char *utf, unsigned char *iso,
 	*iso = '\0';
 }
 
-#ifdef NOT_USED
-/*
- * Cyrillic charsets
- */
-
-/*
- * UTF-8 --->KOI8-R
- */
-static void
-utf_to_KOI8R(unsigned char *utf, unsigned char *iso, int len)
-
-{
-	utf_to_local(utf, iso, ULmap_KOI8R, sizeof(ULmap_KOI8R) / sizeof(pg_utf_to_local), len);
-}
-
-/*
- * UTF-8 --->WIN1251
- */
-static void
-utf_to_WIN1251(unsigned char *utf, unsigned char *iso, int len)
-
-{
-	utf_to_local(utf, iso, ULmap_WIN1251, sizeof(ULmap_WIN1251) / sizeof(pg_utf_to_local), len);
-}
-
-/*
- * UTF-8 --->ALT
- */
-static void
-utf_to_ALT(unsigned char *utf, unsigned char *iso, int len)
-
-{
-	utf_to_local(utf, iso, ULmap_ALT, sizeof(ULmap_ALT) / sizeof(pg_utf_to_local), len);
-}
-
-#endif
-
 /*
  * local code ---> UTF-8
  */
@@ -859,7 +431,7 @@ LocalToUtf(unsigned char *iso, unsigned char *utf,
 					sizeof(pg_local_to_utf), compare2);
 		if (p == NULL)
 		{
-			elog(WARNING, "local_to_utf: could not convert (0x%04x) %s to UTF-8. Ignored",
+			elog(WARNING, "LocalToUtf: could not convert (0x%04x) %s to UTF-8. Ignored",
 				 iiso, (&pg_enc2name_tbl[encoding])->name);
 			continue;
 		}
@@ -874,96 +446,3 @@ LocalToUtf(unsigned char *iso, unsigned char *utf,
 	}
 	*utf = '\0';
 }
-
-#ifdef NOT_USED
-/*
- * KOI8-R ---> UTF-8
- */
-static void
-KOI8R_to_utf(unsigned char *iso, unsigned char *utf, int len)
-{
-	local_to_utf(iso, utf, LUmapKOI8R, sizeof(LUmapKOI8R) / sizeof(pg_local_to_utf), PG_KOI8R, len);
-}
-
-/*
- * WIN1251 ---> UTF-8
- */
-static void
-WIN1251_to_utf(unsigned char *iso, unsigned char *utf, int len)
-{
-	local_to_utf(iso, utf, LUmapWIN1251, sizeof(LUmapWIN1251) / sizeof(pg_local_to_utf), PG_WIN1251, len);
-}
-
-/*
- * ALT ---> UTF-8
- */
-static void
-ALT_to_utf(unsigned char *iso, unsigned char *utf, int len)
-{
-	local_to_utf(iso, utf, LUmapALT, sizeof(LUmapALT) / sizeof(pg_local_to_utf), PG_ALT, len);
-}
-
-/*
- * UTF-8 ---> WIN1250
- */
-static void
-utf_to_win1250(unsigned char *utf, unsigned char *euc, int len)
-
-{
-		utf_to_local(utf, euc, ULmapWIN1250,
-								 sizeof(ULmapWIN1250) / sizeof(pg_utf_to_local), len);
-}
-
-/*
- * WIN1250 ---> UTF-8
- */
-static void
-win1250_to_utf(unsigned char *euc, unsigned char *utf, int len)
-{
-		local_to_utf(euc, utf, LUmapWIN1250,
-						  sizeof(LUmapWIN1250) / sizeof(pg_local_to_utf), PG_WIN1250, len);
-}
-
-/*
- * UTF-8 ---> WIN1256
- */
-static void
-utf_to_win1256(unsigned char *utf, unsigned char *euc, int len)
-
-{
-		utf_to_local(utf, euc, ULmapWIN1256,
-								 sizeof(ULmapWIN1256) / sizeof(pg_utf_to_local), len);
-}
-
-/*
- * WIN1256 ---> UTF-8
- */
-static void
-win1256_to_utf(unsigned char *euc, unsigned char *utf, int len)
-{
-	local_to_utf(euc, utf, LUmapWIN1256,
-			  sizeof(LUmapWIN1256) / sizeof(pg_local_to_utf), PG_WIN1256, len);
-}
-
-/*
- * UTF-8 ---> WIN874
- */
-static void
-utf_to_win874(unsigned char *utf, unsigned char *euc, int len)
-
-{
-	utf_to_local(utf, euc, ULmapWIN874,
-				 sizeof(ULmapWIN874) / sizeof(pg_utf_to_local), len);
-}
-
-/*
- * WIN874 ---> UTF-8
- */
-static void
-win874_to_utf(unsigned char *euc, unsigned char *utf, int len)
-{
-	local_to_utf(euc, utf, LUmapWIN874,
-			  sizeof(LUmapWIN874) / sizeof(pg_local_to_utf), PG_WIN874, len);
-}
-
-#endif
diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile
index a1ab66bc282b669d51354a726907f84712ea37b0..75436d5dee9b502d8af76eec195d2869a4d318aa 100644
--- a/src/backend/utils/mb/conversion_procs/Makefile
+++ b/src/backend/utils/mb/conversion_procs/Makefile
@@ -4,7 +4,7 @@
 #    Makefile for utils/mb/conversion_procs
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/Makefile,v 1.3 2002/08/06 05:40:45 ishii Exp $
+#    $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/Makefile,v 1.4 2002/08/14 02:45:10 ishii Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -18,79 +18,131 @@ SQLSCRIPT = conversion_create.sql
 REGRESSION_SCRIPT = conversion.sql
 
 DIRS = \
-	utf8_and_ascii utf8_and_iso8859_1 \
-	utf8_and_euc_jp utf8_and_euc_kr utf8_and_euc_cn utf8_and_euc_tw \
-	utf8_and_sjis utf8_and_big5 utf8_and_gbk utf8_and_gb18030 \
-	utf8_and_uhc utf8_and_johab utf8_and_tcvn utf8_and_iso8859 \
-	euc_jp_and_sjis euc_tw_and_big5
+	ascii_and_mic cyrillic_and_mic euc_cn_and_mic euc_jp_and_sjis \
+	euc_kr_and_mic euc_tw_and_big5 latin2_and_win1250 latin_and_mic \
+	utf8_and_ascii utf8_and_big5 utf8_and_cyrillic utf8_and_euc_cn \
+	utf8_and_euc_jp utf8_and_euc_kr utf8_and_euc_tw utf8_and_gb18030 \
+	utf8_and_gbk utf8_and_iso8859 utf8_and_iso8859_1 utf8_and_johab \
+	utf8_and_sjis utf8_and_tcvn utf8_and_uhc utf8_and_win1250 \
+	utf8_and_win1256 utf8_and_win874
 
+# conversion_name source_encoding destination_encoding function object
 CONVERSIONS = \
-		utf8_to_ascii UNICODE SQL_ASCII utf8_to_ascii utf8_and_ascii \
-		ascii_to_utf8 SQL_ASCII UNICODE ascii_to_utf8 utf8_and_ascii \
-		utf8_to_iso8859_1 UNICODE LATIN1 utf8_to_iso8859_1 utf8_and_iso8859_1 \
-		iso8859_1_to_utf8 LATIN1 UNICODE iso8859_1_to_utf8 utf8_and_iso8859_1 \
-		euc_jp_to_utf8 EUC_JP UNICODE euc_jp_to_utf8 utf8_and_euc_jp \
-		utf8_to_euc_jp UNICODE EUC_JP utf8_to_euc_jp utf8_and_euc_jp \
-		euc_kr_to_utf8 EUC_KR UNICODE euc_kr_to_utf8 utf8_and_euc_kr \
-		utf8_to_euc_kr UNICODE EUC_KR utf8_to_euc_kr utf8_and_euc_kr \
-		euc_cn_to_utf8 EUC_CN UNICODE euc_cn_to_utf8 utf8_and_euc_cn \
-		utf8_to_euc_cn UNICODE EUC_CN utf8_to_euc_cn utf8_and_euc_cn \
-		euc_tw_to_utf8 EUC_TW UNICODE euc_tw_to_utf8 utf8_and_euc_tw \
-		utf8_to_euc_tw UNICODE EUC_TW utf8_to_euc_tw utf8_and_euc_tw \
-		sjis_to_utf8 SJIS UNICODE sjis_to_utf8 utf8_and_sjis \
-		utf8_to_sjis UNICODE SJIS utf8_to_sjis utf8_and_sjis \
-		big5_to_utf8 BIG5 UNICODE big5_to_utf8 utf8_and_big5 \
-		utf8_to_big5 UNICODE BIG5 utf8_to_big5 utf8_and_big5 \
-		gbk_to_utf8 GBK UNICODE gbk_to_utf8 utf8_and_gbk \
-		utf8_to_gbk UNICODE GBK utf8_to_gbk utf8_and_gbk \
-		gb18030_to_utf8 GB18030 UNICODE gb18030_to_utf8 utf8_and_gb18030 \
-		utf8_to_gb18030 UNICODE GB18030 utf8_to_gb18030 utf8_and_gb18030 \
-		uhc_to_utf8 UHC UNICODE uhc_to_utf8 utf8_and_uhc \
-		utf8_to_uhc UNICODE UHC utf8_to_uhc utf8_and_uhc \
-		johab_to_utf8 JOHAB UNICODE johab_to_utf8 utf8_and_johab \
-		utf8_to_johab UNICODE JOHAB utf8_to_johab utf8_and_johab \
-		tcvn_to_utf8 TCVN UNICODE tcvn_to_utf8 utf8_and_tcvn \
-		utf8_to_tcvn UNICODE TCVN utf8_to_tcvn utf8_and_tcvn \
-		utf8_to_iso8859_2 UNICODE LATIN2 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_2_to_utf8 LATIN2 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_3 UNICODE LATIN3 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_3_to_utf8 LATIN3 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_4 UNICODE LATIN4 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_4_to_utf8 LATIN4 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_9 UNICODE LATIN5 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_9_to_utf8 LATIN5 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_10 UNICODE LATIN6 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_10_to_utf8 LATIN6 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_13 UNICODE LATIN7 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_13_to_utf8 LATIN7 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_14 UNICODE LATIN8 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_14_to_utf8 LATIN8 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_15 UNICODE LATIN9 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_15_to_utf8 LATIN9 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_16 UNICODE LATIN10 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_16_to_utf8 LATIN10 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_5 UNICODE ISO-8859-5 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_5_to_utf8 ISO-8859-5 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_6 UNICODE ISO-8859-6 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_6_to_utf8 ISO-8859-6 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_7 UNICODE ISO-8859-7 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_7_to_utf8 ISO-8859-7 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
-		utf8_to_iso8859_8 UNICODE ISO-8859-8 utf8_to_iso8859 utf8_and_iso8859 \
-		iso8859_8_to_utf8 ISO-8859-8 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		ascii_to_mic	SQL_ASCII MULE_INTERNAL ascii_to_mic ascii_and_mic \
+		mic_to_ascii	MULE_INTERNAL SQL_ASCII mic_to_ascii ascii_and_mic \
+		koi8r_to_mic	KOI8R MULE_INTERNAL koi8r_to_mic cyrillic_and_mic \
+		mic_to_koi8r	MULE_INTERNAL KOI8R mic_to_koi8r cyrillic_and_mic \
+		iso_8859_5_to_mic	ISO-8859-5 MULE_INTERNAL iso_to_mic cyrillic_and_mic \
+		mic_to_iso_8859_5	MULE_INTERNAL ISO-8859-5 mic_to_iso cyrillic_and_mic \
+		win1251_to_mic	WIN1251 MULE_INTERNAL win1251_to_mic cyrillic_and_mic \
+		mic_to_win1251	MULE_INTERNAL WIN1251 mic_to_win1251 cyrillic_and_mic \
+		win866_to_mic	ALT MULE_INTERNAL alt_to_mic cyrillic_and_mic \
+		mic_to_win866	MULE_INTERNAL ALT mic_to_alt cyrillic_and_mic \
+		koi8r_to_win1251   KOI8R WIN1251 koi8r_to_win1251 cyrillic_and_mic \
+		win1251_to_koi8r   WIN1251 KOI8R win1251_to_koi8r cyrillic_and_mic \
+		koi8r_to_win866	KOI8R ALT koi8r_to_alt cyrillic_and_mic \
+		win866_to_koi8r	ALT KOI8R alt_to_koi8r cyrillic_and_mic \
+		win866_to_win1251	ALT WIN1251 alt_to_win1251 cyrillic_and_mic \
+		win1251_to_win866	WIN1251	ALT win1251_to_alt cyrillic_and_mic \
+		iso_8859_5_to_koi8r	ISO-8859-5 KOI8R iso_to_koi8r cyrillic_and_mic \
+		koi8r_to_iso_8859_5	KOI8R ISO-8859-5 koi8r_to_iso cyrillic_and_mic \
+		iso_8859_5_to_win1251	ISO-8859-5 WIN1251 iso_to_win1251 cyrillic_and_mic \
+		win1251_to_iso_8859_5	WIN1251 ISO-8859-5 win1251_to_iso cyrillic_and_mic \
+		iso_8859_5_to_win866	ISO-8859-5 ALT iso_to_alt cyrillic_and_mic \
+		win866_to_iso_8859_5	ALT ISO-8859-5 alt_to_iso cyrillic_and_mic \
+		euc_cn_to_mic	EUC_CN MULE_INTERNAL euc_cn_to_mic euc_cn_and_mic \
+		mic_to_euc_cn	MULE_INTERNAL EUC_CN mic_to_euc_cn euc_cn_and_mic \
 		euc_jp_to_sjis	EUC_JP SJIS euc_jp_to_sjis euc_jp_and_sjis \
 		sjis_to_euc_jp	SJIS EUC_JP sjis_to_euc_jp euc_jp_and_sjis \
 		euc_jp_to_mic	EUC_JP MULE_INTERNAL euc_jp_to_mic euc_jp_and_sjis \
 		sjis_to_mic	SJIS MULE_INTERNAL sjis_to_mic euc_jp_and_sjis \
 		mic_to_euc_jp	MULE_INTERNAL EUC_JP mic_to_euc_jp euc_jp_and_sjis \
 		mic_to_sjis	MULE_INTERNAL SJIS mic_to_sjis euc_jp_and_sjis \
+		euc_kr_to_mic	EUC_KR MULE_INTERNAL euc_kr_to_mic euc_kr_and_mic \
+		mic_to_euc_kr	MULE_INTERNAL EUC_KR mic_to_euc_kr euc_kr_and_mic \
 		euc_tw_to_big5	EUC_TW BIG5 euc_tw_to_big5 euc_tw_and_big5 \
 		big5_to_euc_tw	BIG5 EUC_TW big5_to_euc_tw euc_tw_and_big5 \
 		euc_tw_to_mic	EUC_TW MULE_INTERNAL euc_tw_to_mic euc_tw_and_big5 \
 		big5_to_mic	BIG5 MULE_INTERNAL big5_to_mic euc_tw_and_big5 \
 		mic_to_euc_tw	MULE_INTERNAL EUC_TW mic_to_euc_tw euc_tw_and_big5 \
-		mic_to_big5	MULE_INTERNAL BIG5 mic_to_big5 euc_tw_and_big5
+		mic_to_big5	MULE_INTERNAL BIG5 mic_to_big5 euc_tw_and_big5 \
+		iso_8859_2_to_mic	LATIN2 MULE_INTERNAL latin2_to_mic latin2_and_win1250 \
+		mic_to_iso_8859_2	MULE_INTERNAL LATIN2 mic_to_latin2 latin2_and_win1250 \
+		win1250_to_mic	WIN1250 MULE_INTERNAL win1250_to_mic latin2_and_win1250 \
+		mic_to_win1250	MULE_INTERNAL WIN1250 mic_to_win1250 latin2_and_win1250 \
+		iso_8859_2_to_win1250  LATIN2 WIN1250 latin2_to_win1250 latin2_and_win1250 \
+		win1250_to_iso_8859_2  WIN1250 LATIN2 win1250_to_latin2 latin2_and_win1250 \
+		iso_8859_1_to_mic	LATIN1 MULE_INTERNAL latin1_to_mic latin_and_mic \
+		mic_to_iso_8859_1	MULE_INTERNAL LATIN1 mic_to_latin1 latin_and_mic \
+		iso_8859_3_to_mic	LATIN3 MULE_INTERNAL latin3_to_mic latin_and_mic \
+		mic_to_iso_8859_3	MULE_INTERNAL LATIN3 mic_to_latin3 latin_and_mic \
+		iso_8859_4_to_mic	LATIN4 MULE_INTERNAL latin4_to_mic latin_and_mic \
+		mic_to_iso_8859_4	MULE_INTERNAL LATIN4 mic_to_latin4 latin_and_mic \
+		ascii_to_utf_8 SQL_ASCII UNICODE ascii_to_utf8 utf8_and_ascii \
+		utf_8_to_ascii UNICODE SQL_ASCII utf8_to_ascii utf8_and_ascii \
+		big5_to_utf_8 BIG5 UNICODE big5_to_utf8 utf8_and_big5 \
+		utf_8_to_big5 UNICODE BIG5 utf8_to_big5 utf8_and_big5 \
+		utf_8_to_koi8r	UNICODE KOI8R utf8_to_koi8r utf8_and_cyrillic \
+		koi8r_to_utf_8	KOI8R UNICODE koi8r_to_utf8 utf8_and_cyrillic \
+		utf_8_to_win1251	UNICODE WIN1251 utf8_to_win1251 utf8_and_cyrillic \
+		win1251_to_utf_8	WIN1251 UNICODE win1251_to_utf8 utf8_and_cyrillic \
+		utf_8_to_win866	UNICODE ALT utf8_to_alt utf8_and_cyrillic \
+		win866_to_utf_8	ALT UNICODE alt_to_utf8 utf8_and_cyrillic \
+		euc_cn_to_utf_8 EUC_CN UNICODE euc_cn_to_utf8 utf8_and_euc_cn \
+		utf_8_to_euc_cn UNICODE EUC_CN utf8_to_euc_cn utf8_and_euc_cn \
+		euc_jp_to_utf_8 EUC_JP UNICODE euc_jp_to_utf8 utf8_and_euc_jp \
+		utf_8_to_euc_jp UNICODE EUC_JP utf8_to_euc_jp utf8_and_euc_jp \
+		euc_kr_to_utf_8 EUC_KR UNICODE euc_kr_to_utf8 utf8_and_euc_kr \
+		utf_8_to_euc_kr UNICODE EUC_KR utf8_to_euc_kr utf8_and_euc_kr \
+		euc_tw_to_utf_8 EUC_TW UNICODE euc_tw_to_utf8 utf8_and_euc_tw \
+		utf_8_to_euc_tw UNICODE EUC_TW utf8_to_euc_tw utf8_and_euc_tw \
+		gb18030_to_utf_8 GB18030 UNICODE gb18030_to_utf8 utf8_and_gb18030 \
+		utf_8_to_gb18030 UNICODE GB18030 utf8_to_gb18030 utf8_and_gb18030 \
+		gbk_to_utf_8 GBK UNICODE gbk_to_utf8 utf8_and_gbk \
+		utf_8_to_gbk UNICODE GBK utf8_to_gbk utf8_and_gbk \
+		utf_8_to_iso_8859_2 UNICODE LATIN2 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_2_to_utf_8 LATIN2 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_3 UNICODE LATIN3 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_3_to_utf_8 LATIN3 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_4 UNICODE LATIN4 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_4_to_utf_8 LATIN4 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_9 UNICODE LATIN5 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_9_to_utf_8 LATIN5 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_10 UNICODE LATIN6 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_10_to_utf_8 LATIN6 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_13 UNICODE LATIN7 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_13_to_utf_8 LATIN7 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_14 UNICODE LATIN8 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_14_to_utf_8 LATIN8 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_15 UNICODE LATIN9 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_15_to_utf_8 LATIN9 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_16 UNICODE LATIN10 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_16_to_utf_8 LATIN10 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_5 UNICODE ISO-8859-5 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_5_to_utf_8 ISO-8859-5 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_6 UNICODE ISO-8859-6 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_6_to_utf_8 ISO-8859-6 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_7 UNICODE ISO-8859-7 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_7_to_utf_8 ISO-8859-7 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		utf_8_to_iso_8859_8 UNICODE ISO-8859-8 utf8_to_iso8859 utf8_and_iso8859 \
+		iso_8859_8_to_utf_8 ISO-8859-8 UNICODE iso8859_to_utf8 utf8_and_iso8859 \
+		iso_8859_1_to_utf_8 LATIN1 UNICODE iso8859_1_to_utf8 utf8_and_iso8859_1 \
+		utf_8_to_iso_8859_1 UNICODE LATIN1 utf8_to_iso8859_1 utf8_and_iso8859_1 \
+		johab_to_utf_8 JOHAB UNICODE johab_to_utf8 utf8_and_johab \
+		utf_8_to_johab UNICODE JOHAB utf8_to_johab utf8_and_johab \
+		sjis_to_utf_8 SJIS UNICODE sjis_to_utf8 utf8_and_sjis \
+		utf_8_to_sjis UNICODE SJIS utf8_to_sjis utf8_and_sjis \
+		tcvn_to_utf_8 TCVN UNICODE tcvn_to_utf8 utf8_and_tcvn \
+		utf_8_to_tcvn UNICODE TCVN utf8_to_tcvn utf8_and_tcvn \
+		uhc_to_utf_8 UHC UNICODE uhc_to_utf8 utf8_and_uhc \
+		utf_8_to_uhc UNICODE UHC utf8_to_uhc utf8_and_uhc \
+		utf_8_to_win1250  UNICODE WIN1250 utf_to_win1250 utf8_and_win1250 \
+		win1250_to_utf_8  WIN1250 UNICODE win1250_to_utf utf8_and_win1250 \
+		utf_8_to_win1256  UNICODE WIN1256 utf_to_win1256 utf8_and_win1256 \
+		win1256_to_utf_8  WIN1256 UNICODE win1256_to_utf utf8_and_win1256 \
+		utf_8_to_win874  UNICODE WIN874 utf_to_win874 utf8_and_win874 \
+		win874_to_utf_8  WIN874 UNICODE win874_to_utf utf8_and_win874
 
-# conversion_name source_encoding destination_encoding function object
 $(SQLSCRIPT): Makefile
 	@set $(CONVERSIONS) ; \
 	while [ "$$#" -gt 0 ] ; \
@@ -139,3 +191,4 @@ clean:
 distclean maintainer-clean:
 	$(RM) $(SQLSCRIPT)
 	@for dir in $(DIRS); do $(MAKE) -C $$dir $@; done
+
diff --git a/src/backend/utils/mb/conversion_procs/ascii_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/ascii_and_mic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0535440d95f5ee461b8815d9f200371cbe9c39a5
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/ascii_and_mic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= ascii_and_mic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c b/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed00f189091d14780ab2379802c3ce53576e6394
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c
@@ -0,0 +1,65 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  ASCII and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_FUNCTION_INFO_V1(ascii_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_ascii)
+
+extern Datum ascii_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_ascii(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+Datum
+ascii_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_SQL_ASCII);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	pg_ascii2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_ascii(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_SQL_ASCII);
+	Assert(len > 0);
+
+	pg_mic2ascii(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4ab05b481f28f285ff4c504605c25bdcbf92e723
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= cyrillic_and_mic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
new file mode 100644
index 0000000000000000000000000000000000000000..b336504edea5cf7235234e6ba390a3fa6e6b1acc
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
@@ -0,0 +1,630 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  Cyrillic and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+#define ENCODING_GROWTH_RATE 4
+
+PG_FUNCTION_INFO_V1(koi8r_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_koi8r)
+PG_FUNCTION_INFO_V1(iso_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_iso)
+PG_FUNCTION_INFO_V1(win1251_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_win1251)
+PG_FUNCTION_INFO_V1(alt_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_alt)
+PG_FUNCTION_INFO_V1(koi8r_to_win1251)
+PG_FUNCTION_INFO_V1(win1251_to_koi8r)
+PG_FUNCTION_INFO_V1(koi8r_to_alt)
+PG_FUNCTION_INFO_V1(alt_to_koi8r)
+PG_FUNCTION_INFO_V1(alt_to_win1251)
+PG_FUNCTION_INFO_V1(win1251_to_alt)
+PG_FUNCTION_INFO_V1(iso_to_koi8r)
+PG_FUNCTION_INFO_V1(koi8r_to_iso)
+PG_FUNCTION_INFO_V1(iso_to_win1251)
+PG_FUNCTION_INFO_V1(win1251_to_iso)
+PG_FUNCTION_INFO_V1(iso_to_alt)
+PG_FUNCTION_INFO_V1(alt_to_iso)
+
+extern Datum koi8r_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_koi8r(PG_FUNCTION_ARGS);
+extern Datum iso_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_iso(PG_FUNCTION_ARGS);
+extern Datum win1251_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_win1251(PG_FUNCTION_ARGS);
+extern Datum alt_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_alt(PG_FUNCTION_ARGS);
+extern Datum koi8r_to_win1251(PG_FUNCTION_ARGS);
+extern Datum win1251_to_koi8r(PG_FUNCTION_ARGS);
+extern Datum koi8r_to_alt(PG_FUNCTION_ARGS);
+extern Datum alt_to_koi8r(PG_FUNCTION_ARGS);
+extern Datum alt_to_win1251(PG_FUNCTION_ARGS);
+extern Datum win1251_to_alt(PG_FUNCTION_ARGS);
+extern Datum iso_to_koi8r(PG_FUNCTION_ARGS);
+extern Datum koi8r_to_iso(PG_FUNCTION_ARGS);
+extern Datum iso_to_win1251(PG_FUNCTION_ARGS);
+extern Datum win1251_to_iso(PG_FUNCTION_ARGS);
+extern Datum iso_to_alt(PG_FUNCTION_ARGS);
+extern Datum alt_to_iso(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+static void koi8r2mic(unsigned char *l, unsigned char *p, int len);
+static void mic2koi8r(unsigned char *mic, unsigned char *p, int len);
+static void iso2mic(unsigned char *l, unsigned char *p, int len);
+static void mic2iso(unsigned char *mic, unsigned char *p, int len);
+static void win12512mic(unsigned char *l, unsigned char *p, int len);
+static void mic2win1251(unsigned char *mic, unsigned char *p, int len);
+static void alt2mic(unsigned char *l, unsigned char *p, int len);
+static void mic2alt(unsigned char *mic, unsigned char *p, int len);
+
+Datum 
+koi8r_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_KOI8R);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	koi8r2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+mic_to_koi8r(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_KOI8R);
+	Assert(len > 0);
+
+	mic2koi8r(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+iso_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_ISO_8859_5);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	iso2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_iso(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_ISO_8859_5);
+	Assert(len > 0);
+
+	mic2iso(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1251_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1251);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	win12512mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_win1251(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1251);
+	Assert(len > 0);
+
+	mic2win1251(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+alt_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_ALT);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	alt2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_alt(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_ALT);
+	Assert(len > 0);
+
+	mic2alt(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+koi8r_to_win1251(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_KOI8R);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1251);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	koi8r2mic(src, buf, len);
+	mic2win1251(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+win1251_to_koi8r(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1251);
+	Assert(PG_GETARG_INT32(1) == PG_KOI8R);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	win12512mic(src, buf, len);
+	mic2koi8r(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+koi8r_to_alt(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_KOI8R);
+	Assert(PG_GETARG_INT32(1) == PG_ALT);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	koi8r2mic(src, buf, len);
+	mic2alt(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+alt_to_koi8r(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ALT);
+	Assert(PG_GETARG_INT32(1) == PG_KOI8R);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	alt2mic(src, buf, len);
+	mic2koi8r(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+alt_to_win1251(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ALT);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1251);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	alt2mic(src, buf, len);
+	mic2win1251(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+win1251_to_alt(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1251);
+	Assert(PG_GETARG_INT32(1) == PG_ALT);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	win12512mic(src, buf, len);
+	mic2alt(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+iso_to_koi8r(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ISO_8859_5);
+	Assert(PG_GETARG_INT32(1) == PG_KOI8R);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	iso2mic(src, buf, len);
+	mic2koi8r(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+koi8r_to_iso(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_KOI8R);
+	Assert(PG_GETARG_INT32(1) == PG_ISO_8859_5);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	koi8r2mic(src, buf, len);
+	mic2iso(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+iso_to_win1251(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ISO_8859_5);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1251);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	iso2mic(src, buf, len);
+	mic2win1251(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+win1251_to_iso(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1251);
+	Assert(PG_GETARG_INT32(1) == PG_ISO_8859_5);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	win12512mic(src, buf, len);
+	mic2win1251(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+iso_to_alt(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ISO_8859_5);
+	Assert(PG_GETARG_INT32(1) == PG_ALT);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	iso2mic(src, buf, len);
+	mic2alt(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+alt_to_iso(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_ALT);
+	Assert(PG_GETARG_INT32(1) == PG_ISO_8859_5);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	alt2mic(src, buf, len);
+	mic2alt(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+/*
+ * Cyrillic support
+ * currently supported Cyrillic encodings:
+ *
+ * KOI8-R (this is the charset for the mule internal code
+ *		for Cyrillic)
+ * ISO-8859-5
+ * Microsoft's CP1251(windows-1251)
+ * Alternativny Variant (MS-DOS CP866)
+ */
+
+/* koi8r2mic: KOI8-R to Mule internal code */
+static void
+koi8r2mic(unsigned char *l, unsigned char *p, int len)
+{
+	latin2mic(l, p, len, LC_KOI8_R);
+}
+
+/* mic2koi8r: Mule internal code to KOI8-R */
+static void
+mic2koi8r(unsigned char *mic, unsigned char *p, int len)
+{
+	mic2latin(mic, p, len, LC_KOI8_R);
+}
+
+/* iso2mic: ISO-8859-5 to Mule internal code */
+static void
+iso2mic(unsigned char *l, unsigned char *p, int len)
+{
+	static unsigned char iso2koi[] = {
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
+		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
+		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
+		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
+		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
+		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
+		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	};
+
+	latin2mic_with_table(l, p, len, LC_KOI8_R, iso2koi);
+}
+
+/* mic2iso: Mule internal code to ISO8859-5 */
+static void
+mic2iso(unsigned char *mic, unsigned char *p, int len)
+{
+	static unsigned char koi2iso[] = {
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0xee, 0xd0, 0xd1, 0xe6, 0xd4, 0xd5, 0xe4, 0xd3,
+		0xe5, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
+		0xdf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xd6, 0xd2,
+		0xec, 0xeb, 0xd7, 0xe8, 0xed, 0xe9, 0xe7, 0xea,
+		0xce, 0xb0, 0xb1, 0xc6, 0xb4, 0xb5, 0xc4, 0xb3,
+		0xc5, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
+		0xbf, 0xcf, 0xc0, 0xc1, 0xc2, 0xc3, 0xb6, 0xb2,
+		0xcc, 0xcb, 0xb7, 0xc8, 0xcd, 0xc9, 0xc7, 0xca
+	};
+
+	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2iso);
+}
+
+/* win2mic: CP1251 to Mule internal code */
+static void
+win12512mic(unsigned char *l, unsigned char *p, int len)
+{
+	static unsigned char win2koi[] = {
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
+		0xb3, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xb7,
+		0x00, 0x00, 0xb6, 0xa6, 0xad, 0x00, 0x00, 0x00,
+		0xa3, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xa7,
+		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
+		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
+		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
+		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
+		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
+		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
+		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1
+	};
+
+	latin2mic_with_table(l, p, len, LC_KOI8_R, win2koi);
+}
+
+/* mic2win: Mule internal code to CP1251 */
+static void
+mic2win1251(unsigned char *mic, unsigned char *p, int len)
+{
+	static unsigned char koi2win[] = {
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0xb8, 0xba, 0x00, 0xb3, 0xbf,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0xa8, 0xaa, 0x00, 0xb2, 0xaf,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00,
+		0xfe, 0xe0, 0xe1, 0xf6, 0xe4, 0xe5, 0xf4, 0xe3,
+		0xf5, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,
+		0xef, 0xff, 0xf0, 0xf1, 0xf2, 0xf3, 0xe6, 0xe2,
+		0xfc, 0xfb, 0xe7, 0xf8, 0xfd, 0xf9, 0xf7, 0xfa,
+		0xde, 0xc0, 0xc1, 0xd6, 0xc4, 0xc5, 0xd4, 0xc3,
+		0xd5, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
+		0xcf, 0xdf, 0xd0, 0xd1, 0xd2, 0xd3, 0xc6, 0xc2,
+		0xdc, 0xdb, 0xc7, 0xd8, 0xdd, 0xd9, 0xd7, 0xda
+	};
+
+	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2win);
+}
+
+/* alt2mic: CP866 to Mule internal code */
+static void
+alt2mic(unsigned char *l, unsigned char *p, int len)
+{
+	static unsigned char alt2koi[] = {
+		0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa,
+		0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
+		0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe,
+		0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1,
+		0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda,
+		0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde,
+		0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1,
+		0xb3, 0xa3, 0xb4, 0xa4, 0xb7, 0xa7, 0x00, 0x00,
+		0xb6, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	};
+
+	latin2mic_with_table(l, p, len, LC_KOI8_R, alt2koi);
+}
+
+/* mic2alt: Mule internal code to CP866 */
+static void
+mic2alt(unsigned char *mic, unsigned char *p, int len)
+{
+	static unsigned char koi2alt[] = {
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0xf1, 0xf3, 0x00, 0xf9, 0xf5,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0xf0, 0xf2, 0x00, 0xf8, 0xf4,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00,
+		0xee, 0xa0, 0xa1, 0xe6, 0xa4, 0xa5, 0xe4, 0xa3,
+		0xe5, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
+		0xaf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xa6, 0xa2,
+		0xec, 0xeb, 0xa7, 0xe8, 0xed, 0xe9, 0xe7, 0xea,
+		0x9e, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83,
+		0x95, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
+		0x8f, 0x9f, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82,
+		0x9c, 0x9b, 0x87, 0x98, 0x9d, 0x99, 0x97, 0x9a
+	};
+
+	mic2latin_with_table(mic, p, len, LC_KOI8_R, koi2alt);
+}
+
diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ef0cc1b5ffe74baded5f0b8214aa0cf380c4ee2c
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= euc_cn_and_mic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c
new file mode 100644
index 0000000000000000000000000000000000000000..29b1442b607089be0dd9a96982a0276e457ac801
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c
@@ -0,0 +1,124 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  EUC_CN and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_FUNCTION_INFO_V1(euc_cn_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_euc_cn)
+
+extern Datum euc_cn_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_euc_cn(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+static void euc_cn2mic(unsigned char *euc, unsigned char *p, int len);
+static void mic2euc_cn(unsigned char *mic, unsigned char *p, int len);
+
+Datum
+euc_cn_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_EUC_CN);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	euc_cn2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_euc_cn(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_EUC_CN);
+	Assert(len > 0);
+
+	mic2euc_cn(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+/*
+ * EUC_CN ---> MIC
+ */
+static void
+euc_cn2mic(unsigned char *euc, unsigned char *p, int len)
+{
+	int			c1;
+
+	while (len > 0 && (c1 = *euc++))
+	{
+		if (c1 & 0x80)
+		{
+			len -= 2;
+			*p++ = LC_GB2312_80;
+			*p++ = c1;
+			*p++ = *euc++;
+		}
+		else
+		{						/* should be ASCII */
+			len--;
+			*p++ = c1;
+		}
+	}
+	*p = '\0';
+}
+
+/*
+ * MIC ---> EUC_CN
+ */
+static void
+mic2euc_cn(unsigned char *mic, unsigned char *p, int len)
+{
+	int			c1;
+
+	while (len > 0 && (c1 = *mic))
+	{
+		len -= pg_mic_mblen(mic++);
+
+		if (c1 == LC_GB2312_80)
+		{
+			*p++ = *mic++;
+			*p++ = *mic++;
+		}
+		else if (c1 > 0x7f)
+		{						/* cannot convert to EUC_CN! */
+			mic--;
+			pg_print_bogus_char(&mic, &p);
+		}
+		else
+		{						/* should be ASCII */
+			*p++ = c1;
+		}
+	}
+	*p = '\0';
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..20e78f3b23384a32a085cfe35dd44475f5200f7e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= euc_kr_and_mic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c0d09758b543487246976d85e1dce1b5fa99b2e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c
@@ -0,0 +1,125 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  EUC_KR and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_FUNCTION_INFO_V1(euc_kr_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_euc_kr)
+
+extern Datum euc_kr_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_euc_kr(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+static void euc_kr2mic(unsigned char *euc, unsigned char *p, int len);
+static void mic2euc_kr(unsigned char *mic, unsigned char *p, int len);
+
+Datum
+euc_kr_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_EUC_KR);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	euc_kr2mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_euc_kr(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_EUC_KR);
+	Assert(len > 0);
+
+	mic2euc_kr(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+/*
+ * EUC_KR ---> MIC
+ */
+static void
+euc_kr2mic(unsigned char *euc, unsigned char *p, int len)
+{
+	int			c1;
+
+	while (len > 0 && (c1 = *euc++))
+	{
+		if (c1 & 0x80)
+		{
+			len -= 2;
+			*p++ = LC_KS5601;
+			*p++ = c1;
+			*p++ = *euc++;
+		}
+		else
+		{						/* should be ASCII */
+			len--;
+			*p++ = c1;
+		}
+	}
+	*p = '\0';
+}
+
+/*
+ * MIC ---> EUC_KR
+ */
+static void
+mic2euc_kr(unsigned char *mic, unsigned char *p, int len)
+{
+	int			c1;
+
+	while (len > 0 && (c1 = *mic))
+	{
+		len -= pg_mic_mblen(mic++);
+
+		if (c1 == LC_KS5601)
+		{
+			*p++ = *mic++;
+			*p++ = *mic++;
+		}
+		else if (c1 > 0x7f)
+		{						/* cannot convert to EUC_KR! */
+			mic--;
+			pg_print_bogus_char(&mic, &p);
+		}
+		else
+		{						/* should be ASCII */
+			*p++ = c1;
+		}
+	}
+	*p = '\0';
+}
+
diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d6197c16ce404665e1a9d21466f8797680868d02
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= latin2_and_win1250
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c
new file mode 100644
index 0000000000000000000000000000000000000000..1f75394d04c58c1037c10c1816b81fbeca71f82b
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c
@@ -0,0 +1,216 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  LATIN2 and WIN1250
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+#define ENCODING_GROWTH_RATE 4
+
+PG_FUNCTION_INFO_V1(latin2_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_latin2)
+PG_FUNCTION_INFO_V1(win1250_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_win1250)
+PG_FUNCTION_INFO_V1(latin2_to_win1250)
+PG_FUNCTION_INFO_V1(win1250_to_latin2)
+
+extern Datum latin2_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_latin2(PG_FUNCTION_ARGS);
+extern Datum win1250_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_win1250(PG_FUNCTION_ARGS);
+extern Datum latin2_to_win1250(PG_FUNCTION_ARGS);
+extern Datum win1250_to_latin2(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+static void latin22mic(unsigned char *l, unsigned char *p, int len);
+static void mic2latin2(unsigned char *mic, unsigned char *p, int len);
+static void win12502mic(unsigned char *l, unsigned char *p, int len);
+static void mic2win1250(unsigned char *mic, unsigned char *p, int len);
+
+Datum 
+latin2_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_LATIN2);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	latin22mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+mic_to_latin2(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_LATIN2);
+	Assert(len > 0);
+
+	mic2latin2(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1250_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1250);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	win12502mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+mic_to_win1250(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1250);
+	Assert(len > 0);
+
+	mic2win1250(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+latin2_to_win1250(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_LATIN2);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1250);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	latin22mic(src, buf, len);
+	mic2win1250(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1250_to_latin2(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+	unsigned char *buf;
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1250);
+	Assert(PG_GETARG_INT32(1) == PG_LATIN2);
+	Assert(len > 0);
+
+	buf = palloc(len * ENCODING_GROWTH_RATE);
+	win12502mic(src, buf, len);
+	mic2latin2(buf, dest, strlen(buf));
+	pfree(buf);
+
+	PG_RETURN_INT32(0);
+}
+
+static void
+latin22mic(unsigned char *l, unsigned char *p, int len)
+{
+	latin2mic(l, p, len, LC_ISO8859_2);
+}
+static void
+mic2latin2(unsigned char *mic, unsigned char *p, int len)
+{
+	mic2latin(mic, p, len, LC_ISO8859_2);
+}
+
+/*-----------------------------------------------------------------
+ * WIN1250
+ * Microsoft's CP1250(windows-1250)
+ *-----------------------------------------------------------------*/
+static void
+win12502mic(unsigned char *l, unsigned char *p, int len)
+{
+	static unsigned char win1250_2_iso88592[] = {
+		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+		0x88, 0x89, 0xA9, 0x8B, 0xA6, 0xAB, 0xAE, 0xAC,
+		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+		0x98, 0x99, 0xB9, 0x9B, 0xB6, 0xBB, 0xBE, 0xBC,
+		0xA0, 0xB7, 0xA2, 0xA3, 0xA4, 0xA1, 0x00, 0xA7,
+		0xA8, 0x00, 0xAA, 0x00, 0x00, 0xAD, 0x00, 0xAF,
+		0xB0, 0x00, 0xB2, 0xB3, 0xB4, 0x00, 0x00, 0x00,
+		0xB8, 0xB1, 0xBA, 0x00, 0xA5, 0xBD, 0xB5, 0xBF,
+		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+		0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+		0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+		0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+		0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+		0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+		0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+	};
+
+	latin2mic_with_table(l, p, len, LC_ISO8859_2, win1250_2_iso88592);
+}
+static void
+mic2win1250(unsigned char *mic, unsigned char *p, int len)
+{
+	static unsigned char iso88592_2_win1250[] = {
+		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+		0x88, 0x89, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00,
+		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+		0x98, 0x99, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x00,
+		0xA0, 0xA5, 0xA2, 0xA3, 0xA4, 0xBC, 0x8C, 0xA7,
+		0xA8, 0x8A, 0xAA, 0x8D, 0x8F, 0xAD, 0x8E, 0xAF,
+		0xB0, 0xB9, 0xB2, 0xB3, 0xB4, 0xBE, 0x9C, 0xA1,
+		0xB8, 0x9A, 0xBA, 0x9D, 0x9F, 0xBD, 0x9E, 0xBF,
+		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+		0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+		0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+		0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+		0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+		0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+		0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+	};
+
+	mic2latin_with_table(mic, p, len, LC_ISO8859_2, iso88592_2_win1250);
+}
diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..42f204c66295ccd9272c6be09c2ef056b21734a0
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= latin_and_mic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c
new file mode 100644
index 0000000000000000000000000000000000000000..a019fc274ffab4c470412a25209ac3f911611693
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c
@@ -0,0 +1,175 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  LATINn and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_FUNCTION_INFO_V1(latin1_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_latin1)
+PG_FUNCTION_INFO_V1(latin3_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_latin3)
+PG_FUNCTION_INFO_V1(latin4_to_mic)
+PG_FUNCTION_INFO_V1(mic_to_latin4)
+
+extern Datum latin1_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_latin1(PG_FUNCTION_ARGS);
+extern Datum latin3_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_latin3(PG_FUNCTION_ARGS);
+extern Datum latin4_to_mic(PG_FUNCTION_ARGS);
+extern Datum mic_to_latin4(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+static void latin12mic(unsigned char *l, unsigned char *p, int len);
+static void mic2latin1(unsigned char *mic, unsigned char *p, int len);
+static void latin32mic(unsigned char *l, unsigned char *p, int len);
+static void mic2latin3(unsigned char *mic, unsigned char *p, int len);
+static void latin42mic(unsigned char *l, unsigned char *p, int len);
+static void mic2latin4(unsigned char *mic, unsigned char *p, int len);
+
+Datum 
+latin1_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_LATIN1);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	latin12mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+mic_to_latin1(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_LATIN1);
+	Assert(len > 0);
+
+	mic2latin1(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+latin3_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_LATIN3);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	latin32mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+mic_to_latin3(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_LATIN3);
+	Assert(len > 0);
+
+	mic2latin3(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum 
+latin4_to_mic(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_LATIN4);
+	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
+	Assert(len > 0);
+
+	latin42mic(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum mic_to_latin4(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);
+	Assert(PG_GETARG_INT32(1) == PG_LATIN4);
+	Assert(len > 0);
+
+	mic2latin4(src, dest, len);
+
+	PG_RETURN_INT32(0);
+}
+
+static void
+latin12mic(unsigned char *l, unsigned char *p, int len)
+{
+	latin2mic(l, p, len, LC_ISO8859_1);
+}
+static void
+mic2latin1(unsigned char *mic, unsigned char *p, int len)
+{
+	mic2latin(mic, p, len, LC_ISO8859_1);
+}
+static void
+latin32mic(unsigned char *l, unsigned char *p, int len)
+{
+	latin2mic(l, p, len, LC_ISO8859_3);
+}
+static void
+mic2latin3(unsigned char *mic, unsigned char *p, int len)
+{
+	mic2latin(mic, p, len, LC_ISO8859_3);
+}
+static void
+latin42mic(unsigned char *l, unsigned char *p, int len)
+{
+	latin2mic(l, p, len, LC_ISO8859_4);
+}
+static void
+mic2latin4(unsigned char *mic, unsigned char *p, int len)
+{
+	mic2latin(mic, p, len, LC_ISO8859_4);
+}
+
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ec0e7af1be8769b9f76a584b20579d8d9d1d8ec3
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= utf8_and_cyrillic
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc16a46aca847a22158b33aeaf5b3a06942c4cf0
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c
@@ -0,0 +1,149 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  UTF8 and Cyrillic
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_koi8r.map"
+#include "../../Unicode/koi8r_to_utf8.map"
+#include "../../Unicode/utf8_to_win1251.map"
+#include "../../Unicode/win1251_to_utf8.map"
+#include "../../Unicode/utf8_to_alt.map"
+#include "../../Unicode/alt_to_utf8.map"
+
+PG_FUNCTION_INFO_V1(utf8_to_koi8r)
+PG_FUNCTION_INFO_V1(koi8r_to_utf8)
+PG_FUNCTION_INFO_V1(utf8_to_win1251)
+PG_FUNCTION_INFO_V1(win1251_to_utf8)
+PG_FUNCTION_INFO_V1(utf8_to_alt)
+PG_FUNCTION_INFO_V1(alt_to_utf8)
+
+extern Datum utf8_to_koi8r(PG_FUNCTION_ARGS);
+extern Datum koi8r_to_utf8(PG_FUNCTION_ARGS);
+extern Datum utf8_to_win1251(PG_FUNCTION_ARGS);
+extern Datum win1251_to_utf8(PG_FUNCTION_ARGS);
+extern Datum utf8_to_alt(PG_FUNCTION_ARGS);
+extern Datum alt_to_utf8(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+Datum
+utf8_to_koi8r(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_KOI8R);
+	Assert(len > 0);
+
+  	UtfToLocal(src, dest, ULmap_KOI8R, 
+		   sizeof(ULmap_KOI8R) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+koi8r_to_utf8(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_KOI8R);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+  	LocalToUtf(src, dest, LUmapKOI8R, 
+		   sizeof(LUmapKOI8R) / sizeof(pg_local_to_utf), PG_KOI8R, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+utf8_to_win1251(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1251);
+	Assert(len > 0);
+
+  	UtfToLocal(src, dest, ULmap_WIN1251, 
+		   sizeof(ULmap_WIN1251) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1251_to_utf8(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1251);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+  	LocalToUtf(src, dest, LUmapWIN1251, 
+		   sizeof(LUmapWIN1251) / sizeof(pg_local_to_utf), PG_WIN1251, len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+utf8_to_alt(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_ALT);
+	Assert(len > 0);
+
+	UtfToLocal(src, dest, ULmap_ALT, 
+		   sizeof(ULmap_ALT) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+alt_to_utf8(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_ALT);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+	LocalToUtf(src, dest, LUmapALT, 
+		   sizeof(LUmapALT) / sizeof(pg_local_to_utf), PG_ALT, len);
+
+	PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1250/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..14f7d074ece3794f41f2b938f48cbe49dc51f0c3
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= utf8_and_win1250
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c
new file mode 100644
index 0000000000000000000000000000000000000000..8e61fce00cb1f43540673989685c0702498f17ad
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  WIN1250 and UTF-8
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win1250/Attic/utf8_and_win1250.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_win1250.map"
+#include "../../Unicode/win1250_to_utf8.map"
+
+PG_FUNCTION_INFO_V1(utf_to_win1250)
+PG_FUNCTION_INFO_V1(win1250_to_utf)
+
+extern Datum utf_to_win1250(PG_FUNCTION_ARGS);
+extern Datum win1250_to_utf(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+Datum
+utf_to_win1250(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1250);
+	Assert(len > 0);
+
+	UtfToLocal(src, dest, ULmapWIN1250, 
+		sizeof(ULmapWIN1250) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1250_to_utf(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1250);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+	LocalToUtf(src, dest, LUmapWIN1250,
+		sizeof(LUmapWIN1250) / sizeof(pg_local_to_utf), PG_WIN1250, len);
+
+	PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1256/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..19c59ebfae884550764d356ace03cc0d4dcecf29
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= utf8_and_win1256
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c
new file mode 100644
index 0000000000000000000000000000000000000000..55818f40bbe4c64c2facd1d089362dfb88543268
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  WIN1256 and UTF-8
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win1256/Attic/utf8_and_win1256.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_win1256.map"
+#include "../../Unicode/win1256_to_utf8.map"
+
+PG_FUNCTION_INFO_V1(utf_to_win1256)
+PG_FUNCTION_INFO_V1(win1256_to_utf)
+
+extern Datum utf_to_win1256(PG_FUNCTION_ARGS);
+extern Datum win1256_to_utf(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+Datum
+utf_to_win1256(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_WIN1256);
+	Assert(len > 0);
+
+	UtfToLocal(src, dest, ULmapWIN1256, 
+		sizeof(ULmapWIN1256) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win1256_to_utf(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN1256);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+	LocalToUtf(src, dest, LUmapWIN1256,
+		sizeof(LUmapWIN1256) / sizeof(pg_local_to_utf), PG_WIN1256, len);
+
+	PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win874/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_win874/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..80fe59a317ca76f5a6bbbd586d2b4c45095b6d7f
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win874/Makefile
@@ -0,0 +1,11 @@
+#-------------------------------------------------------------------------
+#
+# $Id: Makefile,v 1.1 2002/08/14 02:45:10 ishii Exp $
+#
+#-------------------------------------------------------------------------
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME		:= utf8_and_win874
+
+include ../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c b/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c
new file mode 100644
index 0000000000000000000000000000000000000000..f343dba68605985d3e0225e40db8a2e54a5d7765
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ *	  WIN874 and UTF-8
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win874/Attic/utf8_and_win874.c,v 1.1 2002/08/14 02:45:10 ishii Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_win874.map"
+#include "../../Unicode/win874_to_utf8.map"
+
+PG_FUNCTION_INFO_V1(utf_to_win874)
+PG_FUNCTION_INFO_V1(win874_to_utf)
+
+extern Datum utf_to_win874(PG_FUNCTION_ARGS);
+extern Datum win874_to_utf(PG_FUNCTION_ARGS);
+
+/* ----------
+ * conv_proc(
+ *		INTEGER,	-- source encoding id
+ *		INTEGER,	-- destination encoding id
+ *		OPAQUE,		-- source string (null terminated C string)
+ *		OPAQUE,		-- destination string (null terminated C string)
+ *		INTEGER		-- source string length
+ * ) returns INTEGER;	-- dummy. returns nothing, actually.
+ * ----------
+ */
+
+Datum
+utf_to_win874(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_UTF8);
+	Assert(PG_GETARG_INT32(1) == PG_WIN874);
+	Assert(len > 0);
+
+	UtfToLocal(src, dest, ULmapWIN874, 
+		sizeof(ULmapWIN874) / sizeof(pg_utf_to_local), len);
+
+	PG_RETURN_INT32(0);
+}
+
+Datum
+win874_to_utf(PG_FUNCTION_ARGS)
+{
+	unsigned char *src = PG_GETARG_CSTRING(2);
+	unsigned char *dest = PG_GETARG_CSTRING(3);
+	int len = PG_GETARG_INT32(4);
+
+	Assert(PG_GETARG_INT32(0) == PG_WIN874);
+	Assert(PG_GETARG_INT32(1) == PG_UTF8);
+	Assert(len > 0);
+
+	LocalToUtf(src, dest, LUmapWIN874,
+		sizeof(LUmapWIN874) / sizeof(pg_local_to_utf), PG_WIN874, len);
+
+	PG_RETURN_INT32(0);
+}
diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h
index f54000e4e8792bdb0ee507d55972a803112d97b7..f89b5e7f3f659d0f3773f882e0ab996b3ce19b3c 100644
--- a/src/include/mb/pg_wchar.h
+++ b/src/include/mb/pg_wchar.h
@@ -1,4 +1,4 @@
-/* $Id: pg_wchar.h,v 1.41 2002/07/29 08:04:55 ishii Exp $ */
+/* $Id: pg_wchar.h,v 1.42 2002/08/14 02:45:10 ishii Exp $ */
 
 #ifndef PG_WCHAR_H
 #define PG_WCHAR_H
@@ -327,5 +327,9 @@ extern char	   *pg_verifymbstr(const unsigned char *mbstr, int len);
 extern void	pg_ascii2mic(unsigned char *src, unsigned char *dest, int len);
 extern void	pg_mic2ascii(unsigned char *src, unsigned char *dest, int len);
 extern void	pg_print_bogus_char(unsigned char **mic, unsigned char **p);
+extern void	latin2mic(unsigned char *l, unsigned char *p, int len, int lc);
+extern void	mic2latin(unsigned char *mic, unsigned char *p, int len, int lc);
+extern void	latin2mic_with_table(unsigned char *l, unsigned char *p, int len, int lc, unsigned char *tab);
+extern void	mic2latin_with_table(unsigned char *mic, unsigned char *p, int len, int lc, unsigned char *tab);
 
 #endif   /* PG_WCHAR_H */
diff --git a/src/test/regress/expected/conversion.out b/src/test/regress/expected/conversion.out
index f1f496464b140ced68b01bd9ee0d7fd5dcc47fb6..dbe76e09746f7231036b2549d7b07f385a41a3a7 100644
--- a/src/test/regress/expected/conversion.out
+++ b/src/test/regress/expected/conversion.out
@@ -25,190 +25,684 @@ DROP CONVERSION myconv;
 DROP CONVERSION mydef;
 --
 -- make sure all pre-defined conversions are fine.
--- UNICODE --> SQL_ASCII
-SELECT CONVERT('foo' USING utf8_to_ascii);
+-- SQL_ASCII --> MULE_INTERNAL
+SELECT CONVERT('foo' USING ascii_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'SQL_ASCII', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> SQL_ASCII
+SELECT CONVERT('foo' USING mic_to_ascii);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'SQL_ASCII');
+ convert 
+---------
+ foo
+(1 row)
+
+-- KOI8R --> MULE_INTERNAL
+SELECT CONVERT('foo' USING koi8r_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'KOI8R', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> KOI8R
+SELECT CONVERT('foo' USING mic_to_koi8r);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'KOI8R');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ISO-8859-5 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_5_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ISO-8859-5', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> ISO-8859-5
+SELECT CONVERT('foo' USING mic_to_iso_8859_5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'ISO-8859-5');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN1251 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win1251_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN1251', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> WIN1251
+SELECT CONVERT('foo' USING mic_to_win1251);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'WIN1251');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ALT --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win866_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ALT', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> ALT
+SELECT CONVERT('foo' USING mic_to_win866);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'ALT');
+ convert 
+---------
+ foo
+(1 row)
+
+-- KOI8R --> WIN1251
+SELECT CONVERT('foo' USING koi8r_to_win1251);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'KOI8R', 'WIN1251');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN1251 --> KOI8R
+SELECT CONVERT('foo' USING win1251_to_koi8r);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN1251', 'KOI8R');
+ convert 
+---------
+ foo
+(1 row)
+
+-- KOI8R --> ALT
+SELECT CONVERT('foo' USING koi8r_to_win866);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'KOI8R', 'ALT');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ALT --> KOI8R
+SELECT CONVERT('foo' USING win866_to_koi8r);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ALT', 'KOI8R');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ALT --> WIN1251
+SELECT CONVERT('foo' USING win866_to_win1251);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ALT', 'WIN1251');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN1251 --> ALT
+SELECT CONVERT('foo' USING win1251_to_win866);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN1251', 'ALT');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ISO-8859-5 --> KOI8R
+SELECT CONVERT('foo' USING iso_8859_5_to_koi8r);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ISO-8859-5', 'KOI8R');
+ convert 
+---------
+ foo
+(1 row)
+
+-- KOI8R --> ISO-8859-5
+SELECT CONVERT('foo' USING koi8r_to_iso_8859_5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'KOI8R', 'ISO-8859-5');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ISO-8859-5 --> WIN1251
+SELECT CONVERT('foo' USING iso_8859_5_to_win1251);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ISO-8859-5', 'WIN1251');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN1251 --> ISO-8859-5
+SELECT CONVERT('foo' USING win1251_to_iso_8859_5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN1251', 'ISO-8859-5');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ISO-8859-5 --> ALT
+SELECT CONVERT('foo' USING iso_8859_5_to_win866);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ISO-8859-5', 'ALT');
+ convert 
+---------
+ foo
+(1 row)
+
+-- ALT --> ISO-8859-5
+SELECT CONVERT('foo' USING win866_to_iso_8859_5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'ALT', 'ISO-8859-5');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_CN --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_cn_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_CN', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> EUC_CN
+SELECT CONVERT('foo' USING mic_to_euc_cn);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_CN');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_JP --> SJIS
+SELECT CONVERT('foo' USING euc_jp_to_sjis);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_JP', 'SJIS');
+ convert 
+---------
+ foo
+(1 row)
+
+-- SJIS --> EUC_JP
+SELECT CONVERT('foo' USING sjis_to_euc_jp);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'SJIS', 'EUC_JP');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_JP --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_jp_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_JP', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- SJIS --> MULE_INTERNAL
+SELECT CONVERT('foo' USING sjis_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'SJIS', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> EUC_JP
+SELECT CONVERT('foo' USING mic_to_euc_jp);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_JP');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> SJIS
+SELECT CONVERT('foo' USING mic_to_sjis);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'SJIS');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_KR --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_kr_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_KR', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> EUC_KR
+SELECT CONVERT('foo' USING mic_to_euc_kr);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_KR');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_TW --> BIG5
+SELECT CONVERT('foo' USING euc_tw_to_big5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_TW', 'BIG5');
+ convert 
+---------
+ foo
+(1 row)
+
+-- BIG5 --> EUC_TW
+SELECT CONVERT('foo' USING big5_to_euc_tw);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'BIG5', 'EUC_TW');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_TW --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_tw_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_TW', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- BIG5 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING big5_to_mic);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'BIG5', 'MULE_INTERNAL');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> EUC_TW
+SELECT CONVERT('foo' USING mic_to_euc_tw);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_TW');
+ convert 
+---------
+ foo
+(1 row)
+
+-- MULE_INTERNAL --> BIG5
+SELECT CONVERT('foo' USING mic_to_big5);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
+-- LATIN2 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_2_to_mic);
  convert 
 ---------
  foo
 (1 row)
 
--- SQL_ASCII --> UNICODE
-SELECT CONVERT('foo' USING ascii_to_utf8);
+SELECT CONVERT('foo', 'LATIN2', 'MULE_INTERNAL');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'SQL_ASCII', 'UNICODE');
+-- MULE_INTERNAL --> LATIN2
+SELECT CONVERT('foo' USING mic_to_iso_8859_2);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> LATIN1
-SELECT CONVERT('foo' USING utf8_to_iso8859_1);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN2');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
+-- WIN1250 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win1250_to_mic);
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN1 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_1_to_utf8);
+SELECT CONVERT('foo', 'WIN1250', 'MULE_INTERNAL');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
+-- MULE_INTERNAL --> WIN1250
+SELECT CONVERT('foo' USING mic_to_win1250);
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_JP --> UNICODE
-SELECT CONVERT('foo' USING euc_jp_to_utf8);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'WIN1250');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_JP', 'UNICODE');
+-- LATIN2 --> WIN1250
+SELECT CONVERT('foo' USING iso_8859_2_to_win1250);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> EUC_JP
-SELECT CONVERT('foo' USING utf8_to_euc_jp);
+SELECT CONVERT('foo', 'LATIN2', 'WIN1250');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'EUC_JP');
+-- WIN1250 --> LATIN2
+SELECT CONVERT('foo' USING win1250_to_iso_8859_2);
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_KR --> UNICODE
-SELECT CONVERT('foo' USING euc_kr_to_utf8);
+SELECT CONVERT('foo', 'WIN1250', 'LATIN2');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_KR', 'UNICODE');
+-- LATIN1 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_1_to_mic);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> EUC_KR
-SELECT CONVERT('foo' USING utf8_to_euc_kr);
+SELECT CONVERT('foo', 'LATIN1', 'MULE_INTERNAL');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'EUC_KR');
+-- MULE_INTERNAL --> LATIN1
+SELECT CONVERT('foo' USING mic_to_iso_8859_1);
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_CN --> UNICODE
-SELECT CONVERT('foo' USING euc_cn_to_utf8);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN1');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
+-- LATIN3 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_3_to_mic);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> EUC_CN
-SELECT CONVERT('foo' USING utf8_to_euc_cn);
+SELECT CONVERT('foo', 'LATIN3', 'MULE_INTERNAL');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
+-- MULE_INTERNAL --> LATIN3
+SELECT CONVERT('foo' USING mic_to_iso_8859_3);
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_TW --> UNICODE
-SELECT CONVERT('foo' USING euc_tw_to_utf8);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN3');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_TW', 'UNICODE');
+-- LATIN4 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_4_to_mic);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> EUC_TW
-SELECT CONVERT('foo' USING utf8_to_euc_tw);
+SELECT CONVERT('foo', 'LATIN4', 'MULE_INTERNAL');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'EUC_TW');
+-- MULE_INTERNAL --> LATIN4
+SELECT CONVERT('foo' USING mic_to_iso_8859_4);
  convert 
 ---------
  foo
 (1 row)
 
--- SJIS --> UNICODE
-SELECT CONVERT('foo' USING sjis_to_utf8);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN4');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'SJIS', 'UNICODE');
+-- SQL_ASCII --> UNICODE
+SELECT CONVERT('foo' USING ascii_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> SJIS
-SELECT CONVERT('foo' USING utf8_to_sjis);
+SELECT CONVERT('foo', 'SQL_ASCII', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'SJIS');
+-- UNICODE --> SQL_ASCII
+SELECT CONVERT('foo' USING utf_8_to_ascii);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
  convert 
 ---------
  foo
 (1 row)
 
 -- BIG5 --> UNICODE
-SELECT CONVERT('foo' USING big5_to_utf8);
+SELECT CONVERT('foo' USING big5_to_utf_8);
  convert 
 ---------
  foo
@@ -221,7 +715,7 @@ SELECT CONVERT('foo', 'BIG5', 'UNICODE');
 (1 row)
 
 -- UNICODE --> BIG5
-SELECT CONVERT('foo' USING utf8_to_big5);
+SELECT CONVERT('foo' USING utf_8_to_big5);
  convert 
 ---------
  foo
@@ -233,138 +727,242 @@ SELECT CONVERT('foo', 'UNICODE', 'BIG5');
  foo
 (1 row)
 
--- GBK --> UNICODE
-SELECT CONVERT('foo' USING gbk_to_utf8);
+-- UNICODE --> KOI8R
+SELECT CONVERT('foo' USING utf_8_to_koi8r);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'GBK', 'UNICODE');
+SELECT CONVERT('foo', 'UNICODE', 'KOI8R');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> GBK
-SELECT CONVERT('foo' USING utf8_to_gbk);
+-- KOI8R --> UNICODE
+SELECT CONVERT('foo' USING koi8r_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'GBK');
+SELECT CONVERT('foo', 'KOI8R', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- GB18030 --> UNICODE
-SELECT CONVERT('foo' USING gb18030_to_utf8);
+-- UNICODE --> WIN1251
+SELECT CONVERT('foo' USING utf_8_to_win1251);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'GB18030', 'UNICODE');
+SELECT CONVERT('foo', 'UNICODE', 'WIN1251');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> GB18030
-SELECT CONVERT('foo' USING utf8_to_gb18030);
+-- WIN1251 --> UNICODE
+SELECT CONVERT('foo' USING win1251_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'GB18030');
+SELECT CONVERT('foo', 'WIN1251', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UHC --> UNICODE
-SELECT CONVERT('foo' USING uhc_to_utf8);
+-- UNICODE --> ALT
+SELECT CONVERT('foo' USING utf_8_to_win866);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UHC', 'UNICODE');
+SELECT CONVERT('foo', 'UNICODE', 'ALT');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> UHC
-SELECT CONVERT('foo' USING utf8_to_uhc);
+-- ALT --> UNICODE
+SELECT CONVERT('foo' USING win866_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'UHC');
+SELECT CONVERT('foo', 'ALT', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- JOHAB --> UNICODE
-SELECT CONVERT('foo' USING johab_to_utf8);
+-- EUC_CN --> UNICODE
+SELECT CONVERT('foo' USING euc_cn_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
+SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> JOHAB
-SELECT CONVERT('foo' USING utf8_to_johab);
+-- UNICODE --> EUC_CN
+SELECT CONVERT('foo' USING utf_8_to_euc_cn);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
+SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
  convert 
 ---------
  foo
 (1 row)
 
--- TCVN --> UNICODE
-SELECT CONVERT('foo' USING tcvn_to_utf8);
+-- EUC_JP --> UNICODE
+SELECT CONVERT('foo' USING euc_jp_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'TCVN', 'UNICODE');
+SELECT CONVERT('foo', 'EUC_JP', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE --> TCVN
-SELECT CONVERT('foo' USING utf8_to_tcvn);
+-- UNICODE --> EUC_JP
+SELECT CONVERT('foo' USING utf_8_to_euc_jp);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'UNICODE', 'TCVN');
+SELECT CONVERT('foo', 'UNICODE', 'EUC_JP');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_KR --> UNICODE
+SELECT CONVERT('foo' USING euc_kr_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_KR', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> EUC_KR
+SELECT CONVERT('foo' USING utf_8_to_euc_kr);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'EUC_KR');
+ convert 
+---------
+ foo
+(1 row)
+
+-- EUC_TW --> UNICODE
+SELECT CONVERT('foo' USING euc_tw_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'EUC_TW', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> EUC_TW
+SELECT CONVERT('foo' USING utf_8_to_euc_tw);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'EUC_TW');
+ convert 
+---------
+ foo
+(1 row)
+
+-- GB18030 --> UNICODE
+SELECT CONVERT('foo' USING gb18030_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'GB18030', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> GB18030
+SELECT CONVERT('foo' USING utf_8_to_gb18030);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'GB18030');
+ convert 
+---------
+ foo
+(1 row)
+
+-- GBK --> UNICODE
+SELECT CONVERT('foo' USING gbk_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'GBK', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> GBK
+SELECT CONVERT('foo' USING utf_8_to_gbk);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'GBK');
  convert 
 ---------
  foo
 (1 row)
 
 -- UNICODE --> LATIN2
-SELECT CONVERT('foo' USING utf8_to_iso8859_2);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_2);
  convert 
 ---------
  foo
@@ -377,7 +975,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN2');
 (1 row)
 
 -- LATIN2 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_2_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_2_to_utf_8);
  convert 
 ---------
  foo
@@ -390,7 +988,7 @@ SELECT CONVERT('foo', 'LATIN2', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN3
-SELECT CONVERT('foo' USING utf8_to_iso8859_3);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_3);
  convert 
 ---------
  foo
@@ -403,7 +1001,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN3');
 (1 row)
 
 -- LATIN3 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_3_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_3_to_utf_8);
  convert 
 ---------
  foo
@@ -416,7 +1014,7 @@ SELECT CONVERT('foo', 'LATIN3', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN4
-SELECT CONVERT('foo' USING utf8_to_iso8859_4);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_4);
  convert 
 ---------
  foo
@@ -429,7 +1027,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN4');
 (1 row)
 
 -- LATIN4 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_4_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_4_to_utf_8);
  convert 
 ---------
  foo
@@ -442,7 +1040,7 @@ SELECT CONVERT('foo', 'LATIN4', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN5
-SELECT CONVERT('foo' USING utf8_to_iso8859_9);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_9);
  convert 
 ---------
  foo
@@ -455,7 +1053,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN5');
 (1 row)
 
 -- LATIN5 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_9_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_9_to_utf_8);
  convert 
 ---------
  foo
@@ -468,7 +1066,7 @@ SELECT CONVERT('foo', 'LATIN5', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN6
-SELECT CONVERT('foo' USING utf8_to_iso8859_10);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_10);
  convert 
 ---------
  foo
@@ -481,7 +1079,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN6');
 (1 row)
 
 -- LATIN6 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_10_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_10_to_utf_8);
  convert 
 ---------
  foo
@@ -494,7 +1092,7 @@ SELECT CONVERT('foo', 'LATIN6', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN7
-SELECT CONVERT('foo' USING utf8_to_iso8859_13);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_13);
  convert 
 ---------
  foo
@@ -507,7 +1105,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN7');
 (1 row)
 
 -- LATIN7 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_13_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_13_to_utf_8);
  convert 
 ---------
  foo
@@ -520,7 +1118,7 @@ SELECT CONVERT('foo', 'LATIN7', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN8
-SELECT CONVERT('foo' USING utf8_to_iso8859_14);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_14);
  convert 
 ---------
  foo
@@ -533,7 +1131,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN8');
 (1 row)
 
 -- LATIN8 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_14_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_14_to_utf_8);
  convert 
 ---------
  foo
@@ -546,7 +1144,7 @@ SELECT CONVERT('foo', 'LATIN8', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN9
-SELECT CONVERT('foo' USING utf8_to_iso8859_15);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_15);
  convert 
 ---------
  foo
@@ -559,7 +1157,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN9');
 (1 row)
 
 -- LATIN9 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_15_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_15_to_utf_8);
  convert 
 ---------
  foo
@@ -572,7 +1170,7 @@ SELECT CONVERT('foo', 'LATIN9', 'UNICODE');
 (1 row)
 
 -- UNICODE --> LATIN10
-SELECT CONVERT('foo' USING utf8_to_iso8859_16);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_16);
  convert 
 ---------
  foo
@@ -585,7 +1183,7 @@ SELECT CONVERT('foo', 'UNICODE', 'LATIN10');
 (1 row)
 
 -- LATIN10 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_16_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_16_to_utf_8);
  convert 
 ---------
  foo
@@ -598,7 +1196,7 @@ SELECT CONVERT('foo', 'LATIN10', 'UNICODE');
 (1 row)
 
 -- UNICODE --> ISO-8859-5
-SELECT CONVERT('foo' USING utf8_to_iso8859_5);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_5);
  convert 
 ---------
  foo
@@ -611,7 +1209,7 @@ SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-5');
 (1 row)
 
 -- ISO-8859-5 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_5_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_5_to_utf_8);
  convert 
 ---------
  foo
@@ -624,7 +1222,7 @@ SELECT CONVERT('foo', 'ISO-8859-5', 'UNICODE');
 (1 row)
 
 -- UNICODE --> ISO-8859-6
-SELECT CONVERT('foo' USING utf8_to_iso8859_6);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_6);
  convert 
 ---------
  foo
@@ -637,7 +1235,7 @@ SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-6');
 (1 row)
 
 -- ISO-8859-6 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_6_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_6_to_utf_8);
  convert 
 ---------
  foo
@@ -650,7 +1248,7 @@ SELECT CONVERT('foo', 'ISO-8859-6', 'UNICODE');
 (1 row)
 
 -- UNICODE --> ISO-8859-7
-SELECT CONVERT('foo' USING utf8_to_iso8859_7);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_7);
  convert 
 ---------
  foo
@@ -663,7 +1261,7 @@ SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-7');
 (1 row)
 
 -- ISO-8859-7 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_7_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_7_to_utf_8);
  convert 
 ---------
  foo
@@ -676,7 +1274,7 @@ SELECT CONVERT('foo', 'ISO-8859-7', 'UNICODE');
 (1 row)
 
 -- UNICODE --> ISO-8859-8
-SELECT CONVERT('foo' USING utf8_to_iso8859_8);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_8);
  convert 
 ---------
  foo
@@ -689,7 +1287,7 @@ SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-8');
 (1 row)
 
 -- ISO-8859-8 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_8_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_8_to_utf_8);
  convert 
 ---------
  foo
@@ -701,157 +1299,209 @@ SELECT CONVERT('foo', 'ISO-8859-8', 'UNICODE');
  foo
 (1 row)
 
--- EUC_JP --> SJIS
-SELECT CONVERT('foo' USING euc_jp_to_sjis);
+-- LATIN1 --> UNICODE
+SELECT CONVERT('foo' USING iso_8859_1_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_JP', 'SJIS');
+SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- SJIS --> EUC_JP
-SELECT CONVERT('foo' USING sjis_to_euc_jp);
+-- UNICODE --> LATIN1
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_1);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'SJIS', 'EUC_JP');
+SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_JP --> MULE_INTERNAL
-SELECT CONVERT('foo' USING euc_jp_to_mic);
+-- JOHAB --> UNICODE
+SELECT CONVERT('foo' USING johab_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_JP', 'MULE_INTERNAL');
+SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- SJIS --> MULE_INTERNAL
-SELECT CONVERT('foo' USING sjis_to_mic);
+-- UNICODE --> JOHAB
+SELECT CONVERT('foo' USING utf_8_to_johab);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'SJIS', 'MULE_INTERNAL');
+SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
  convert 
 ---------
  foo
 (1 row)
 
--- MULE_INTERNAL --> EUC_JP
-SELECT CONVERT('foo' USING mic_to_euc_jp);
+-- SJIS --> UNICODE
+SELECT CONVERT('foo' USING sjis_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_JP');
+SELECT CONVERT('foo', 'SJIS', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- MULE_INTERNAL --> SJIS
-SELECT CONVERT('foo' USING mic_to_sjis);
+-- UNICODE --> SJIS
+SELECT CONVERT('foo' USING utf_8_to_sjis);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'SJIS');
+SELECT CONVERT('foo', 'UNICODE', 'SJIS');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_TW --> BIG5
-SELECT CONVERT('foo' USING euc_tw_to_big5);
+-- TCVN --> UNICODE
+SELECT CONVERT('foo' USING tcvn_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_TW', 'BIG5');
+SELECT CONVERT('foo', 'TCVN', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- BIG5 --> EUC_TW
-SELECT CONVERT('foo' USING big5_to_euc_tw);
+-- UNICODE --> TCVN
+SELECT CONVERT('foo' USING utf_8_to_tcvn);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'BIG5', 'EUC_TW');
+SELECT CONVERT('foo', 'UNICODE', 'TCVN');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_TW --> MULE_INTERNAL
-SELECT CONVERT('foo' USING euc_tw_to_mic);
+-- UHC --> UNICODE
+SELECT CONVERT('foo' USING uhc_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'EUC_TW', 'MULE_INTERNAL');
+SELECT CONVERT('foo', 'UHC', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- BIG5 --> MULE_INTERNAL
-SELECT CONVERT('foo' USING big5_to_mic);
+-- UNICODE --> UHC
+SELECT CONVERT('foo' USING utf_8_to_uhc);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'BIG5', 'MULE_INTERNAL');
+SELECT CONVERT('foo', 'UNICODE', 'UHC');
  convert 
 ---------
  foo
 (1 row)
 
--- MULE_INTERNAL --> EUC_TW
-SELECT CONVERT('foo' USING mic_to_euc_tw);
+-- UNICODE --> WIN1250
+SELECT CONVERT('foo' USING utf_8_to_win1250);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_TW');
+SELECT CONVERT('foo', 'UNICODE', 'WIN1250');
  convert 
 ---------
  foo
 (1 row)
 
--- MULE_INTERNAL --> BIG5
-SELECT CONVERT('foo' USING mic_to_big5);
+-- WIN1250 --> UNICODE
+SELECT CONVERT('foo' USING win1250_to_utf_8);
  convert 
 ---------
  foo
 (1 row)
 
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
+SELECT CONVERT('foo', 'WIN1250', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> WIN1256
+SELECT CONVERT('foo' USING utf_8_to_win1256);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'WIN1256');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN1256 --> UNICODE
+SELECT CONVERT('foo' USING win1256_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN1256', 'UNICODE');
+ convert 
+---------
+ foo
+(1 row)
+
+-- UNICODE --> WIN874
+SELECT CONVERT('foo' USING utf_8_to_win874);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'UNICODE', 'WIN874');
+ convert 
+---------
+ foo
+(1 row)
+
+-- WIN874 --> UNICODE
+SELECT CONVERT('foo' USING win874_to_utf_8);
+ convert 
+---------
+ foo
+(1 row)
+
+SELECT CONVERT('foo', 'WIN874', 'UNICODE');
  convert 
 ---------
  foo
diff --git a/src/test/regress/sql/conversion.sql b/src/test/regress/sql/conversion.sql
index e4639d86278720f95dbee032ef4da7a435e68399..d95b91975f90eee1eb7dc0bfa36009d60923df32 100644
--- a/src/test/regress/sql/conversion.sql
+++ b/src/test/regress/sql/conversion.sql
@@ -23,198 +23,348 @@ DROP CONVERSION myconv;
 DROP CONVERSION mydef;
 --
 -- make sure all pre-defined conversions are fine.
--- UNICODE --> SQL_ASCII
-SELECT CONVERT('foo' USING utf8_to_ascii);
-SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
+-- SQL_ASCII --> MULE_INTERNAL
+SELECT CONVERT('foo' USING ascii_to_mic);
+SELECT CONVERT('foo', 'SQL_ASCII', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> SQL_ASCII
+SELECT CONVERT('foo' USING mic_to_ascii);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'SQL_ASCII');
+-- KOI8R --> MULE_INTERNAL
+SELECT CONVERT('foo' USING koi8r_to_mic);
+SELECT CONVERT('foo', 'KOI8R', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> KOI8R
+SELECT CONVERT('foo' USING mic_to_koi8r);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'KOI8R');
+-- ISO-8859-5 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_5_to_mic);
+SELECT CONVERT('foo', 'ISO-8859-5', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> ISO-8859-5
+SELECT CONVERT('foo' USING mic_to_iso_8859_5);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'ISO-8859-5');
+-- WIN1251 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win1251_to_mic);
+SELECT CONVERT('foo', 'WIN1251', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> WIN1251
+SELECT CONVERT('foo' USING mic_to_win1251);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'WIN1251');
+-- ALT --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win866_to_mic);
+SELECT CONVERT('foo', 'ALT', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> ALT
+SELECT CONVERT('foo' USING mic_to_win866);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'ALT');
+-- KOI8R --> WIN1251
+SELECT CONVERT('foo' USING koi8r_to_win1251);
+SELECT CONVERT('foo', 'KOI8R', 'WIN1251');
+-- WIN1251 --> KOI8R
+SELECT CONVERT('foo' USING win1251_to_koi8r);
+SELECT CONVERT('foo', 'WIN1251', 'KOI8R');
+-- KOI8R --> ALT
+SELECT CONVERT('foo' USING koi8r_to_win866);
+SELECT CONVERT('foo', 'KOI8R', 'ALT');
+-- ALT --> KOI8R
+SELECT CONVERT('foo' USING win866_to_koi8r);
+SELECT CONVERT('foo', 'ALT', 'KOI8R');
+-- ALT --> WIN1251
+SELECT CONVERT('foo' USING win866_to_win1251);
+SELECT CONVERT('foo', 'ALT', 'WIN1251');
+-- WIN1251 --> ALT
+SELECT CONVERT('foo' USING win1251_to_win866);
+SELECT CONVERT('foo', 'WIN1251', 'ALT');
+-- ISO-8859-5 --> KOI8R
+SELECT CONVERT('foo' USING iso_8859_5_to_koi8r);
+SELECT CONVERT('foo', 'ISO-8859-5', 'KOI8R');
+-- KOI8R --> ISO-8859-5
+SELECT CONVERT('foo' USING koi8r_to_iso_8859_5);
+SELECT CONVERT('foo', 'KOI8R', 'ISO-8859-5');
+-- ISO-8859-5 --> WIN1251
+SELECT CONVERT('foo' USING iso_8859_5_to_win1251);
+SELECT CONVERT('foo', 'ISO-8859-5', 'WIN1251');
+-- WIN1251 --> ISO-8859-5
+SELECT CONVERT('foo' USING win1251_to_iso_8859_5);
+SELECT CONVERT('foo', 'WIN1251', 'ISO-8859-5');
+-- ISO-8859-5 --> ALT
+SELECT CONVERT('foo' USING iso_8859_5_to_win866);
+SELECT CONVERT('foo', 'ISO-8859-5', 'ALT');
+-- ALT --> ISO-8859-5
+SELECT CONVERT('foo' USING win866_to_iso_8859_5);
+SELECT CONVERT('foo', 'ALT', 'ISO-8859-5');
+-- EUC_CN --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_cn_to_mic);
+SELECT CONVERT('foo', 'EUC_CN', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> EUC_CN
+SELECT CONVERT('foo' USING mic_to_euc_cn);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_CN');
+-- EUC_JP --> SJIS
+SELECT CONVERT('foo' USING euc_jp_to_sjis);
+SELECT CONVERT('foo', 'EUC_JP', 'SJIS');
+-- SJIS --> EUC_JP
+SELECT CONVERT('foo' USING sjis_to_euc_jp);
+SELECT CONVERT('foo', 'SJIS', 'EUC_JP');
+-- EUC_JP --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_jp_to_mic);
+SELECT CONVERT('foo', 'EUC_JP', 'MULE_INTERNAL');
+-- SJIS --> MULE_INTERNAL
+SELECT CONVERT('foo' USING sjis_to_mic);
+SELECT CONVERT('foo', 'SJIS', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> EUC_JP
+SELECT CONVERT('foo' USING mic_to_euc_jp);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_JP');
+-- MULE_INTERNAL --> SJIS
+SELECT CONVERT('foo' USING mic_to_sjis);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'SJIS');
+-- EUC_KR --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_kr_to_mic);
+SELECT CONVERT('foo', 'EUC_KR', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> EUC_KR
+SELECT CONVERT('foo' USING mic_to_euc_kr);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_KR');
+-- EUC_TW --> BIG5
+SELECT CONVERT('foo' USING euc_tw_to_big5);
+SELECT CONVERT('foo', 'EUC_TW', 'BIG5');
+-- BIG5 --> EUC_TW
+SELECT CONVERT('foo' USING big5_to_euc_tw);
+SELECT CONVERT('foo', 'BIG5', 'EUC_TW');
+-- EUC_TW --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_tw_to_mic);
+SELECT CONVERT('foo', 'EUC_TW', 'MULE_INTERNAL');
+-- BIG5 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING big5_to_mic);
+SELECT CONVERT('foo', 'BIG5', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> EUC_TW
+SELECT CONVERT('foo' USING mic_to_euc_tw);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_TW');
+-- MULE_INTERNAL --> BIG5
+SELECT CONVERT('foo' USING mic_to_big5);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
+-- LATIN2 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_2_to_mic);
+SELECT CONVERT('foo', 'LATIN2', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> LATIN2
+SELECT CONVERT('foo' USING mic_to_iso_8859_2);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN2');
+-- WIN1250 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING win1250_to_mic);
+SELECT CONVERT('foo', 'WIN1250', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> WIN1250
+SELECT CONVERT('foo' USING mic_to_win1250);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'WIN1250');
+-- LATIN2 --> WIN1250
+SELECT CONVERT('foo' USING iso_8859_2_to_win1250);
+SELECT CONVERT('foo', 'LATIN2', 'WIN1250');
+-- WIN1250 --> LATIN2
+SELECT CONVERT('foo' USING win1250_to_iso_8859_2);
+SELECT CONVERT('foo', 'WIN1250', 'LATIN2');
+-- LATIN1 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_1_to_mic);
+SELECT CONVERT('foo', 'LATIN1', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> LATIN1
+SELECT CONVERT('foo' USING mic_to_iso_8859_1);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN1');
+-- LATIN3 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_3_to_mic);
+SELECT CONVERT('foo', 'LATIN3', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> LATIN3
+SELECT CONVERT('foo' USING mic_to_iso_8859_3);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN3');
+-- LATIN4 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING iso_8859_4_to_mic);
+SELECT CONVERT('foo', 'LATIN4', 'MULE_INTERNAL');
+-- MULE_INTERNAL --> LATIN4
+SELECT CONVERT('foo' USING mic_to_iso_8859_4);
+SELECT CONVERT('foo', 'MULE_INTERNAL', 'LATIN4');
 -- SQL_ASCII --> UNICODE
-SELECT CONVERT('foo' USING ascii_to_utf8);
+SELECT CONVERT('foo' USING ascii_to_utf_8);
 SELECT CONVERT('foo', 'SQL_ASCII', 'UNICODE');
--- UNICODE --> LATIN1
-SELECT CONVERT('foo' USING utf8_to_iso8859_1);
-SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
--- LATIN1 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_1_to_utf8);
-SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
+-- UNICODE --> SQL_ASCII
+SELECT CONVERT('foo' USING utf_8_to_ascii);
+SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
+-- BIG5 --> UNICODE
+SELECT CONVERT('foo' USING big5_to_utf_8);
+SELECT CONVERT('foo', 'BIG5', 'UNICODE');
+-- UNICODE --> BIG5
+SELECT CONVERT('foo' USING utf_8_to_big5);
+SELECT CONVERT('foo', 'UNICODE', 'BIG5');
+-- UNICODE --> KOI8R
+SELECT CONVERT('foo' USING utf_8_to_koi8r);
+SELECT CONVERT('foo', 'UNICODE', 'KOI8R');
+-- KOI8R --> UNICODE
+SELECT CONVERT('foo' USING koi8r_to_utf_8);
+SELECT CONVERT('foo', 'KOI8R', 'UNICODE');
+-- UNICODE --> WIN1251
+SELECT CONVERT('foo' USING utf_8_to_win1251);
+SELECT CONVERT('foo', 'UNICODE', 'WIN1251');
+-- WIN1251 --> UNICODE
+SELECT CONVERT('foo' USING win1251_to_utf_8);
+SELECT CONVERT('foo', 'WIN1251', 'UNICODE');
+-- UNICODE --> ALT
+SELECT CONVERT('foo' USING utf_8_to_win866);
+SELECT CONVERT('foo', 'UNICODE', 'ALT');
+-- ALT --> UNICODE
+SELECT CONVERT('foo' USING win866_to_utf_8);
+SELECT CONVERT('foo', 'ALT', 'UNICODE');
+-- EUC_CN --> UNICODE
+SELECT CONVERT('foo' USING euc_cn_to_utf_8);
+SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
+-- UNICODE --> EUC_CN
+SELECT CONVERT('foo' USING utf_8_to_euc_cn);
+SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
 -- EUC_JP --> UNICODE
-SELECT CONVERT('foo' USING euc_jp_to_utf8);
+SELECT CONVERT('foo' USING euc_jp_to_utf_8);
 SELECT CONVERT('foo', 'EUC_JP', 'UNICODE');
 -- UNICODE --> EUC_JP
-SELECT CONVERT('foo' USING utf8_to_euc_jp);
+SELECT CONVERT('foo' USING utf_8_to_euc_jp);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_JP');
 -- EUC_KR --> UNICODE
-SELECT CONVERT('foo' USING euc_kr_to_utf8);
+SELECT CONVERT('foo' USING euc_kr_to_utf_8);
 SELECT CONVERT('foo', 'EUC_KR', 'UNICODE');
 -- UNICODE --> EUC_KR
-SELECT CONVERT('foo' USING utf8_to_euc_kr);
+SELECT CONVERT('foo' USING utf_8_to_euc_kr);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_KR');
--- EUC_CN --> UNICODE
-SELECT CONVERT('foo' USING euc_cn_to_utf8);
-SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
--- UNICODE --> EUC_CN
-SELECT CONVERT('foo' USING utf8_to_euc_cn);
-SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
 -- EUC_TW --> UNICODE
-SELECT CONVERT('foo' USING euc_tw_to_utf8);
+SELECT CONVERT('foo' USING euc_tw_to_utf_8);
 SELECT CONVERT('foo', 'EUC_TW', 'UNICODE');
 -- UNICODE --> EUC_TW
-SELECT CONVERT('foo' USING utf8_to_euc_tw);
+SELECT CONVERT('foo' USING utf_8_to_euc_tw);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_TW');
--- SJIS --> UNICODE
-SELECT CONVERT('foo' USING sjis_to_utf8);
-SELECT CONVERT('foo', 'SJIS', 'UNICODE');
--- UNICODE --> SJIS
-SELECT CONVERT('foo' USING utf8_to_sjis);
-SELECT CONVERT('foo', 'UNICODE', 'SJIS');
--- BIG5 --> UNICODE
-SELECT CONVERT('foo' USING big5_to_utf8);
-SELECT CONVERT('foo', 'BIG5', 'UNICODE');
--- UNICODE --> BIG5
-SELECT CONVERT('foo' USING utf8_to_big5);
-SELECT CONVERT('foo', 'UNICODE', 'BIG5');
--- GBK --> UNICODE
-SELECT CONVERT('foo' USING gbk_to_utf8);
-SELECT CONVERT('foo', 'GBK', 'UNICODE');
--- UNICODE --> GBK
-SELECT CONVERT('foo' USING utf8_to_gbk);
-SELECT CONVERT('foo', 'UNICODE', 'GBK');
 -- GB18030 --> UNICODE
-SELECT CONVERT('foo' USING gb18030_to_utf8);
+SELECT CONVERT('foo' USING gb18030_to_utf_8);
 SELECT CONVERT('foo', 'GB18030', 'UNICODE');
 -- UNICODE --> GB18030
-SELECT CONVERT('foo' USING utf8_to_gb18030);
+SELECT CONVERT('foo' USING utf_8_to_gb18030);
 SELECT CONVERT('foo', 'UNICODE', 'GB18030');
--- UHC --> UNICODE
-SELECT CONVERT('foo' USING uhc_to_utf8);
-SELECT CONVERT('foo', 'UHC', 'UNICODE');
--- UNICODE --> UHC
-SELECT CONVERT('foo' USING utf8_to_uhc);
-SELECT CONVERT('foo', 'UNICODE', 'UHC');
--- JOHAB --> UNICODE
-SELECT CONVERT('foo' USING johab_to_utf8);
-SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
--- UNICODE --> JOHAB
-SELECT CONVERT('foo' USING utf8_to_johab);
-SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
--- TCVN --> UNICODE
-SELECT CONVERT('foo' USING tcvn_to_utf8);
-SELECT CONVERT('foo', 'TCVN', 'UNICODE');
--- UNICODE --> TCVN
-SELECT CONVERT('foo' USING utf8_to_tcvn);
-SELECT CONVERT('foo', 'UNICODE', 'TCVN');
+-- GBK --> UNICODE
+SELECT CONVERT('foo' USING gbk_to_utf_8);
+SELECT CONVERT('foo', 'GBK', 'UNICODE');
+-- UNICODE --> GBK
+SELECT CONVERT('foo' USING utf_8_to_gbk);
+SELECT CONVERT('foo', 'UNICODE', 'GBK');
 -- UNICODE --> LATIN2
-SELECT CONVERT('foo' USING utf8_to_iso8859_2);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_2);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN2');
 -- LATIN2 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_2_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_2_to_utf_8);
 SELECT CONVERT('foo', 'LATIN2', 'UNICODE');
 -- UNICODE --> LATIN3
-SELECT CONVERT('foo' USING utf8_to_iso8859_3);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_3);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN3');
 -- LATIN3 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_3_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_3_to_utf_8);
 SELECT CONVERT('foo', 'LATIN3', 'UNICODE');
 -- UNICODE --> LATIN4
-SELECT CONVERT('foo' USING utf8_to_iso8859_4);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_4);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN4');
 -- LATIN4 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_4_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_4_to_utf_8);
 SELECT CONVERT('foo', 'LATIN4', 'UNICODE');
 -- UNICODE --> LATIN5
-SELECT CONVERT('foo' USING utf8_to_iso8859_9);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_9);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN5');
 -- LATIN5 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_9_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_9_to_utf_8);
 SELECT CONVERT('foo', 'LATIN5', 'UNICODE');
 -- UNICODE --> LATIN6
-SELECT CONVERT('foo' USING utf8_to_iso8859_10);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_10);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN6');
 -- LATIN6 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_10_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_10_to_utf_8);
 SELECT CONVERT('foo', 'LATIN6', 'UNICODE');
 -- UNICODE --> LATIN7
-SELECT CONVERT('foo' USING utf8_to_iso8859_13);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_13);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN7');
 -- LATIN7 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_13_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_13_to_utf_8);
 SELECT CONVERT('foo', 'LATIN7', 'UNICODE');
 -- UNICODE --> LATIN8
-SELECT CONVERT('foo' USING utf8_to_iso8859_14);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_14);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN8');
 -- LATIN8 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_14_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_14_to_utf_8);
 SELECT CONVERT('foo', 'LATIN8', 'UNICODE');
 -- UNICODE --> LATIN9
-SELECT CONVERT('foo' USING utf8_to_iso8859_15);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_15);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN9');
 -- LATIN9 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_15_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_15_to_utf_8);
 SELECT CONVERT('foo', 'LATIN9', 'UNICODE');
 -- UNICODE --> LATIN10
-SELECT CONVERT('foo' USING utf8_to_iso8859_16);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_16);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN10');
 -- LATIN10 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_16_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_16_to_utf_8);
 SELECT CONVERT('foo', 'LATIN10', 'UNICODE');
 -- UNICODE --> ISO-8859-5
-SELECT CONVERT('foo' USING utf8_to_iso8859_5);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_5);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-5');
 -- ISO-8859-5 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_5_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_5_to_utf_8);
 SELECT CONVERT('foo', 'ISO-8859-5', 'UNICODE');
 -- UNICODE --> ISO-8859-6
-SELECT CONVERT('foo' USING utf8_to_iso8859_6);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_6);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-6');
 -- ISO-8859-6 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_6_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_6_to_utf_8);
 SELECT CONVERT('foo', 'ISO-8859-6', 'UNICODE');
 -- UNICODE --> ISO-8859-7
-SELECT CONVERT('foo' USING utf8_to_iso8859_7);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_7);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-7');
 -- ISO-8859-7 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_7_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_7_to_utf_8);
 SELECT CONVERT('foo', 'ISO-8859-7', 'UNICODE');
 -- UNICODE --> ISO-8859-8
-SELECT CONVERT('foo' USING utf8_to_iso8859_8);
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_8);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-8');
 -- ISO-8859-8 --> UNICODE
-SELECT CONVERT('foo' USING iso8859_8_to_utf8);
+SELECT CONVERT('foo' USING iso_8859_8_to_utf_8);
 SELECT CONVERT('foo', 'ISO-8859-8', 'UNICODE');
--- EUC_JP --> SJIS
-SELECT CONVERT('foo' USING euc_jp_to_sjis);
-SELECT CONVERT('foo', 'EUC_JP', 'SJIS');
--- SJIS --> EUC_JP
-SELECT CONVERT('foo' USING sjis_to_euc_jp);
-SELECT CONVERT('foo', 'SJIS', 'EUC_JP');
--- EUC_JP --> MULE_INTERNAL
-SELECT CONVERT('foo' USING euc_jp_to_mic);
-SELECT CONVERT('foo', 'EUC_JP', 'MULE_INTERNAL');
--- SJIS --> MULE_INTERNAL
-SELECT CONVERT('foo' USING sjis_to_mic);
-SELECT CONVERT('foo', 'SJIS', 'MULE_INTERNAL');
--- MULE_INTERNAL --> EUC_JP
-SELECT CONVERT('foo' USING mic_to_euc_jp);
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_JP');
--- MULE_INTERNAL --> SJIS
-SELECT CONVERT('foo' USING mic_to_sjis);
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'SJIS');
--- EUC_TW --> BIG5
-SELECT CONVERT('foo' USING euc_tw_to_big5);
-SELECT CONVERT('foo', 'EUC_TW', 'BIG5');
--- BIG5 --> EUC_TW
-SELECT CONVERT('foo' USING big5_to_euc_tw);
-SELECT CONVERT('foo', 'BIG5', 'EUC_TW');
--- EUC_TW --> MULE_INTERNAL
-SELECT CONVERT('foo' USING euc_tw_to_mic);
-SELECT CONVERT('foo', 'EUC_TW', 'MULE_INTERNAL');
--- BIG5 --> MULE_INTERNAL
-SELECT CONVERT('foo' USING big5_to_mic);
-SELECT CONVERT('foo', 'BIG5', 'MULE_INTERNAL');
--- MULE_INTERNAL --> EUC_TW
-SELECT CONVERT('foo' USING mic_to_euc_tw);
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_TW');
--- MULE_INTERNAL --> BIG5
-SELECT CONVERT('foo' USING mic_to_big5);
-SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
+-- LATIN1 --> UNICODE
+SELECT CONVERT('foo' USING iso_8859_1_to_utf_8);
+SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
+-- UNICODE --> LATIN1
+SELECT CONVERT('foo' USING utf_8_to_iso_8859_1);
+SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
+-- JOHAB --> UNICODE
+SELECT CONVERT('foo' USING johab_to_utf_8);
+SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
+-- UNICODE --> JOHAB
+SELECT CONVERT('foo' USING utf_8_to_johab);
+SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
+-- SJIS --> UNICODE
+SELECT CONVERT('foo' USING sjis_to_utf_8);
+SELECT CONVERT('foo', 'SJIS', 'UNICODE');
+-- UNICODE --> SJIS
+SELECT CONVERT('foo' USING utf_8_to_sjis);
+SELECT CONVERT('foo', 'UNICODE', 'SJIS');
+-- TCVN --> UNICODE
+SELECT CONVERT('foo' USING tcvn_to_utf_8);
+SELECT CONVERT('foo', 'TCVN', 'UNICODE');
+-- UNICODE --> TCVN
+SELECT CONVERT('foo' USING utf_8_to_tcvn);
+SELECT CONVERT('foo', 'UNICODE', 'TCVN');
+-- UHC --> UNICODE
+SELECT CONVERT('foo' USING uhc_to_utf_8);
+SELECT CONVERT('foo', 'UHC', 'UNICODE');
+-- UNICODE --> UHC
+SELECT CONVERT('foo' USING utf_8_to_uhc);
+SELECT CONVERT('foo', 'UNICODE', 'UHC');
+-- UNICODE --> WIN1250
+SELECT CONVERT('foo' USING utf_8_to_win1250);
+SELECT CONVERT('foo', 'UNICODE', 'WIN1250');
+-- WIN1250 --> UNICODE
+SELECT CONVERT('foo' USING win1250_to_utf_8);
+SELECT CONVERT('foo', 'WIN1250', 'UNICODE');
+-- UNICODE --> WIN1256
+SELECT CONVERT('foo' USING utf_8_to_win1256);
+SELECT CONVERT('foo', 'UNICODE', 'WIN1256');
+-- WIN1256 --> UNICODE
+SELECT CONVERT('foo' USING win1256_to_utf_8);
+SELECT CONVERT('foo', 'WIN1256', 'UNICODE');
+-- UNICODE --> WIN874
+SELECT CONVERT('foo' USING utf_8_to_win874);
+SELECT CONVERT('foo', 'UNICODE', 'WIN874');
+-- WIN874 --> UNICODE
+SELECT CONVERT('foo' USING win874_to_utf_8);
+SELECT CONVERT('foo', 'WIN874', 'UNICODE');
 --
 -- return to the super user
 --