Add SQL99 CONVERT() function.
authorTatsuo Ishii
Tue, 6 Aug 2002 05:40:47 +0000 (05:40 +0000)
committerTatsuo Ishii
Tue, 6 Aug 2002 05:40:47 +0000 (05:40 +0000)
15 files changed:
doc/src/sgml/func.sgml
src/backend/catalog/namespace.c
src/backend/catalog/pg_conversion.c
src/backend/parser/gram.y
src/backend/parser/keywords.c
src/backend/utils/mb/Makefile
src/backend/utils/mb/conversion_procs/Makefile
src/backend/utils/mb/conversion_procs/regress_epilogue [new file with mode: 0644]
src/backend/utils/mb/conversion_procs/regress_prolog [new file with mode: 0644]
src/include/catalog/catversion.h
src/include/catalog/namespace.h
src/include/catalog/pg_conversion.h
src/include/catalog/pg_proc.h
src/test/regress/expected/conversion.out
src/test/regress/sql/conversion.sql

index dfebb45e1bc80c5730b8f1b410acaef6c3efb8b0..aed47db79b92de57db3e615c234429b100ceed9c 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -857,6 +857,19 @@ PostgreSQL documentation
        4
       
 
+      
+       convert(string
+       using conversion_name)
+       text
+       Change encoding using specified conversion name.
+       Conversions can be defined by CREATE CONVERSION.
+       Also there are some pre-defined conversion names. 
+       See  for available
+       conversion names. 
+       convert('PostgreSQL' using iso8859_1_to_utf8)
+       'PostgreSQL' in UNICODE(UTF-8) encoding
+      
+
       
        lower(string)
        text
@@ -947,6 +960,405 @@ PostgreSQL documentation
     
    
 
+   
+    Available conversion names
+    
+     
+      
+       conversion
+       source encoding
+       destination encoding
+      
+     
+     
+      
+       ascii_to_utf8
+       SQL_ASCII
+       UNICODE
+      
+
+      
+       big5_to_euc_tw
+       BIG5
+       EUC_TW
+      
+
+      
+       big5_to_mic
+       BIG5
+       MULE_INTERNAL
+      
+
+      
+       big5_to_utf8
+       BIG5
+       UNICODE
+      
+
+      
+       euc_cn_to_utf8
+       EUC_CN
+       UNICODE
+      
+
+      
+       euc_jp_to_mic
+       EUC_JP
+       MULE_INTERNAL
+      
+
+      
+       euc_jp_to_sjis
+       EUC_JP
+       SJIS
+      
+
+      
+       euc_jp_to_utf8
+       EUC_JP
+       UNICODE
+      
+
+      
+       euc_kr_to_utf8
+       EUC_KR
+       UNICODE
+      
+
+      
+       euc_tw_to_big5
+       EUC_TW
+       BIG5
+      
+
+      
+       euc_tw_to_mic
+       EUC_TW
+       MULE_INTERNAL
+      
+
+      
+       euc_tw_to_utf8
+       EUC_TW
+       UNICODE
+      
+
+      
+       gb18030_to_utf8
+       GB18030
+       UNICODE
+      
+
+      
+       gbk_to_utf8
+       GBK
+       UNICODE
+      
+
+      
+       iso8859_10_to_utf8
+       LATIN6
+       UNICODE
+      
+
+      
+       iso8859_13_to_utf8
+       LATIN7
+       UNICODE
+      
+
+      
+       iso8859_14_to_utf8
+       LATIN8
+       UNICODE
+      
+
+      
+       iso8859_15_to_utf8
+       LATIN9
+       UNICODE
+      
+
+      
+       iso8859_16_to_utf8
+       LATIN10
+       UNICODE
+      
+
+      
+       iso8859_1_to_utf8
+       LATIN1
+       UNICODE
+      
+
+      
+       iso8859_2_to_utf8
+       LATIN2
+       UNICODE
+      
+
+      
+       iso8859_3_to_utf8
+       LATIN3
+       UNICODE
+      
+
+      
+       iso8859_4_to_utf8
+       LATIN4
+       UNICODE
+      
+
+      
+       iso8859_5_to_utf8
+       ISO_8859_5
+       UNICODE
+      
+
+      
+       iso8859_6_to_utf8
+       ISO_8859_6
+       UNICODE
+      
+
+      
+       iso8859_7_to_utf8
+       ISO_8859_7
+       UNICODE
+      
+
+      
+       iso8859_8_to_utf8
+       ISO_8859_8
+       UNICODE
+      
+
+      
+       iso8859_9_to_utf8
+       LATIN5
+       UNICODE
+      
+
+      
+       johab_to_utf8
+       JOHAB
+       UNICODE
+      
+
+      
+       mic_to_big5
+       MULE_INTERNAL
+       BIG5
+      
+
+      
+       mic_to_euc_jp
+       MULE_INTERNAL
+       EUC_JP
+      
+
+      
+       mic_to_euc_tw
+       MULE_INTERNAL
+       EUC_TW
+      
+
+      
+       mic_to_sjis
+       MULE_INTERNAL
+       SJIS
+      
+
+      
+       sjis_to_euc_jp
+       SJIS
+       EUC_JP
+      
+
+      
+       sjis_to_mic
+       SJIS
+       MULE_INTERNAL
+      
+
+      
+       sjis_to_utf8
+       SJIS
+       UNICODE
+      
+
+      
+       tcvn_to_utf8
+       TCVN
+       UNICODE
+      
+
+      
+       uhc_to_utf8
+       UHC
+       UNICODE
+      
+
+      
+       utf8_to_ascii
+       UNICODE
+       SQL_ASCII
+      
+
+      
+       utf8_to_big5
+       UNICODE
+       BIG5
+      
+
+      
+       utf8_to_euc_cn
+       UNICODE
+       EUC_CN
+      
+
+      
+       utf8_to_euc_jp
+       UNICODE
+       EUC_JP
+      
+
+      
+       utf8_to_euc_kr
+       UNICODE
+       EUC_KR
+      
+
+      
+       utf8_to_euc_tw
+       UNICODE
+       EUC_TW
+      
+
+      
+       utf8_to_gb18030
+       UNICODE
+       GB18030
+      
+
+      
+       utf8_to_gbk
+       UNICODE
+       GBK
+      
+
+      
+       utf8_to_iso8859_1
+       UNICODE
+       LATIN1
+      
+
+      
+       utf8_to_iso8859_10
+       UNICODE
+       LATIN6
+      
+
+      
+       utf8_to_iso8859_13
+       UNICODE
+       LATIN7
+      
+
+      
+       utf8_to_iso8859_14
+       UNICODE
+       LATIN8
+      
+
+      
+       utf8_to_iso8859_15
+       UNICODE
+       LATIN9
+      
+
+      
+       utf8_to_iso8859_16
+       UNICODE
+       LATIN10
+      
+
+      
+       utf8_to_iso8859_2
+       UNICODE
+       LATIN2
+      
+
+      
+       utf8_to_iso8859_3
+       UNICODE
+       LATIN3
+      
+
+      
+       utf8_to_iso8859_4
+       UNICODE
+       LATIN4
+      
+
+      
+       utf8_to_iso8859_5
+       UNICODE
+       ISO_8859_5
+      
+
+      
+       utf8_to_iso8859_6
+       UNICODE
+       ISO_8859_6
+      
+
+      
+       utf8_to_iso8859_7
+       UNICODE
+       ISO_8859_7
+      
+
+      
+       utf8_to_iso8859_8
+       UNICODE
+       ISO_8859_8
+      
+
+      
+       utf8_to_iso8859_9
+       UNICODE
+       LATIN5
+      
+
+      
+       utf8_to_johab
+       UNICODE
+       JOHAB
+      
+
+      
+       utf8_to_sjis
+       UNICODE
+       SJIS
+      
+
+      
+       utf8_to_tcvn
+       UNICODE
+       TCVN
+      
+
+      
+       utf8_to_uhc
+       UNICODE
+       UHC
+      
+
+     
+    
+   
+
    
     Additional string manipulation functions are available and are
     listed below.  Some of them are used internally to implement the
index 0425e44c1cd8653bb0cbd037d90047b99eae7f55..bc2098034f3ca6f925852864da90b9509bb83094 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.27 2002/07/29 23:46:35 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.28 2002/08/06 05:40:44 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1238,6 +1238,43 @@ PopSpecialNamespace(Oid namespaceId)
    namespaceSearchPathValid = false;
 }
 
+/*
+ * FindConversionByName - find a conversion by possibly qualified name
+ */
+Oid FindConversionByName(List *name)
+{
+   char        *conversion_name;
+   Oid namespaceId;
+   Oid conoid;
+   List       *lptr;
+
+   /* Convert list of names to a name and namespace */
+   namespaceId = QualifiedNameGetCreationNamespace(name, &conversion_name);
+
+   if (length(name) > 1)
+   {
+       /* Check we have usage rights in target namespace */
+       if (pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
+           return InvalidOid;
+
+       return FindConversion(conversion_name, namespaceId);
+   }
+
+   recomputeNamespacePath();
+
+   foreach(lptr, namespaceSearchPath)
+   {
+       Oid         namespaceId = (Oid) lfirsti(lptr);
+
+       conoid = FindConversion(conversion_name, namespaceId);
+       if (OidIsValid(conoid))
+           return conoid;
+   }
+
+   /* Not found in path */
+   return InvalidOid;
+}
+
 /*
  * FindDefaultConversionProc - find default encoding cnnversion proc
  */
index c422e33e3178866df628e6d8862aac36b0838265..7dfd0679a22112318789cbf522baf89af2f276ed 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.4 2002/08/05 03:29:16 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.5 2002/08/06 05:40:45 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -221,7 +221,7 @@ RemoveConversionById(Oid conversionOid)
    if (HeapTupleIsValid(tuple = heap_getnext(scan, ForwardScanDirection)))
        simple_heap_delete(rel, &tuple->t_self);
    else
-       elog(ERROR, "Conversion %u does not exist", conversionOid);
+       elog(ERROR, "conversion %u does not exist", conversionOid);
    heap_endscan(scan);
    heap_close(rel, RowExclusiveLock);
 }
@@ -233,47 +233,6 @@ RemoveConversionById(Oid conversionOid)
  * If found, returns the procedure's oid, otherwise InvalidOid.
  * ---------------
  */
-#ifdef NOT_USED
-Oid FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding)
-{
-   Relation rel;
-   HeapScanDesc scan;
-   ScanKeyData scanKeyData;
-   HeapTuple   tuple;
-   Form_pg_conversion body;
-   Oid proc = InvalidOid;
-
-   /* Check we have usage rights in target namespace */
-   if (pg_namespace_aclcheck(name_space, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
-       return InvalidOid;
-
-   ScanKeyEntryInitialize(&scanKeyData,
-                          0,
-                          Anum_pg_conversion_connamespace,
-                          F_OIDEQ,
-                          ObjectIdGetDatum(name_space));
-
-   rel = heap_openr(ConversionRelationName, AccessShareLock);
-   scan = heap_beginscan(rel, SnapshotNow,
-                             1, &scanKeyData);
-
-   while (HeapTupleIsValid(tuple = heap_getnext(scan, ForwardScanDirection)))
-   {
-       body = (Form_pg_conversion)GETSTRUCT(tuple);
-       if (body->conforencoding == for_encoding &&
-           body->contoencoding == to_encoding &&
-           body->condefault == TRUE)
-       {
-           proc = body->conproc;
-           break;
-       }
-   }
-   heap_endscan(scan);
-   heap_close(rel, AccessShareLock);
-   return proc;
-}
-#endif
-
 Oid FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding)
 {
    CatCList    *catlist;
@@ -309,34 +268,27 @@ Oid FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding)
 /* ----------------
  * FindConversionByName
  *
- * Find conversion proc by possibly qualified conversion name.
+ * Find conversion by namespace and conversion name.
+ * Returns conversion oid.
  * ---------------
  */
-Oid FindConversionByName(List *name)
+Oid FindConversion(const char *conname, Oid connamespace)
 {
    HeapTuple   tuple;
-   char        *conversion_name;
-   Oid namespaceId;
    Oid procoid;
+   Oid conoid;
    AclResult   aclresult;
 
-   /* Convert list of names to a name and namespace */
-   namespaceId = QualifiedNameGetCreationNamespace(name, &conversion_name);
-
-   /* Check we have usage rights in target namespace */
-   if (pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
-       return InvalidOid;
-
-   /* search pg_conversion by namespaceId and conversion name */
+   /* search pg_conversion by connamespace and conversion name */
    tuple = SearchSysCache(CONNAMESP,
-                          PointerGetDatum(conversion_name),
-                          ObjectIdGetDatum(namespaceId),
+                          PointerGetDatum(conname),
+                          ObjectIdGetDatum(connamespace),
                           0,0);
 
    if (!HeapTupleIsValid(tuple))
        return InvalidOid;
-
    procoid = ((Form_pg_conversion)GETSTRUCT(tuple))->conproc;
+   conoid = HeapTupleGetOid(tuple);
 
    ReleaseSysCache(tuple);
 
@@ -345,6 +297,69 @@ Oid FindConversionByName(List *name)
    if (aclresult != ACLCHECK_OK)
        return InvalidOid;
 
-   return procoid;
+   return conoid;
 }
 
+/*
+ * Execute SQL99's CONVERT function.
+ *
+ * CONVERT  
+ * USING  
+ *
+ * TEXT convert3(TEXT string, OID conversion_oid);
+ */
+Datum
+pg_convert3(PG_FUNCTION_ARGS)
+{
+   text       *string = PG_GETARG_TEXT_P(0);
+   Oid         convoid = PG_GETARG_OID(1);
+   HeapTuple   tuple;
+   Form_pg_conversion body;
+   text       *retval;
+   unsigned char *str;
+   unsigned char *result;
+   int len;
+
+   if (!OidIsValid(convoid))
+       elog(ERROR, "Conversion does not exist");
+
+   /* make sure that source string is null terminated */
+   len = VARSIZE(string) - VARHDRSZ;
+   str = palloc(len + 1);
+   memcpy(str, VARDATA(string), len);
+   *(str + len) = '\0';
+
+   tuple = SearchSysCache(CONOID,
+                          ObjectIdGetDatum(convoid),
+                          0,0,0);
+   if (!HeapTupleIsValid(tuple))
+       elog(ERROR, "Conversion %u search from syscache failed", convoid);
+
+   result = palloc(len * 4 + 1);
+
+   body = (Form_pg_conversion)GETSTRUCT(tuple);
+   OidFunctionCall5(body->conproc,
+                    Int32GetDatum(body->conforencoding),
+                    Int32GetDatum(body->contoencoding),
+                    CStringGetDatum(str),
+                    CStringGetDatum(result),
+                    Int32GetDatum(len));
+
+   ReleaseSysCache(tuple);
+
+   /* build text data type structre. we cannot use textin() here,
+      since textin assumes that input string encoding is same as
+      database encoding.  */
+   len = strlen(result) + VARHDRSZ;
+   retval = palloc(len);
+   VARATT_SIZEP(retval) = len;
+   memcpy(VARDATA(retval), result, len - VARHDRSZ);
+
+   pfree(result);
+   pfree(str);
+
+   /* free memory if allocated by the toaster */
+   PG_FREE_IF_COPY(string, 0);
+
+   PG_RETURN_TEXT_P(retval);
+}
index 5c77aebfe6215dac78602465beaab81fce474e07..f57f461124dc435b614087ff44b548cc87b960b2 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.356 2002/08/05 02:30:50 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.357 2002/08/06 05:40:45 ishii Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -53,6 +53,7 @@
 #include "access/htup.h"
 #include "catalog/index.h"
 #include "catalog/namespace.h"
+#include "catalog/pg_conversion.h"
 #include "catalog/pg_type.h"
 #include "nodes/makefuncs.h"
 #include "nodes/params.h"
@@ -216,7 +217,8 @@ static void doNegateFloat(Value *v);
                insert_target_list, def_list, opt_indirection,
                group_clause, TriggerFuncArgs, select_limit,
                opt_select_limit, opclass_item_list, trans_options,
-               TableFuncElementList, OptTableFuncElementList
+               TableFuncElementList, OptTableFuncElementList,
+               convert_args
 
 %type   into_clause, OptTempTableName
 
@@ -232,7 +234,7 @@ static void doNegateFloat(Value *v);
 %type   join_type
 
 %type    extract_list, overlay_list, position_list
-%type    substr_list, trim_list
+%type    substr_list, trim_list, convert_list
 %type    opt_interval
 %type    overlay_placing, substr_from, substr_for
 
@@ -329,7 +331,7 @@ static void doNegateFloat(Value *v);
    CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR_P,
    CHARACTER, CHARACTERISTICS, CHECK, CHECKPOINT, CLASS, CLOSE,
    CLUSTER, COALESCE, COLLATE, COLUMN, COMMENT, COMMIT,
-   COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, COPY, CREATE, CREATEDB,
+   COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, CONVERT, COPY, CREATE, CREATEDB,
    CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME,
    CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
 
@@ -6253,6 +6255,15 @@ c_expr:      columnref                               { $$ = (Node *) $1; }
                    n->agg_distinct = FALSE;
                    $$ = (Node *)n;
                }
+           | CONVERT '(' convert_list ')'
+               {
+                   FuncCall *n = makeNode(FuncCall);
+                   n->funcname = SystemFuncName("convert");
+                   n->args = $3;
+                   n->agg_star = FALSE;
+                   n->agg_distinct = FALSE;
+                   $$ = (Node *)n;
+               }
            | select_with_parens            %prec UMINUS
                {
                    SubLink *n = makeNode(SubLink);
@@ -6418,6 +6429,48 @@ trim_list:   a_expr FROM expr_list                   { $$ = lappend($3, $1); }
            | expr_list                             { $$ = $1; }
        ;
 
+/* CONVERT() arguments. We accept followings:
+ * SQL99 syntax
+ * o CONVERT(TEXT string USING conversion_name)
+ *
+ * Function calls
+ * o CONVERT(TEXT string, NAME src_encoding_name, NAME dest_encoding_name)
+ * o CONVERT(TEXT string, NAME encoding_name)
+ */
+convert_list:
+           a_expr USING any_name
+               {
+                   Oid oid = FindConversionByName($3);
+                   Const *convoid = makeNode(Const);
+
+                   if (!OidIsValid(oid))
+                   {
+                       elog(ERROR, "Conversion \"%s\" does not exist",
+                        NameListToString($3));
+                   }
+
+                   convoid->consttype = OIDOID;
+                   convoid->constlen = sizeof(Oid);
+                   convoid->constvalue = oid;
+                   convoid->constisnull = FALSE;
+                   convoid->constbyval = TRUE;
+                   convoid->constisset = FALSE;
+                   convoid->constiscast = FALSE;
+                   $$ = makeList2($1, convoid);
+               }
+           | convert_args
+               {
+                 $$ = $1;
+               }
+           | /*EMPTY*/
+               { $$ = NIL; }
+       ;
+
+convert_args:  a_expr                              { $$ = makeList1($1); }
+           | convert_args ',' a_expr                   { $$ = lappend($1, $3); }
+       ;
+  
+
 in_expr:   select_with_parens
                {
                    SubLink *n = makeNode(SubLink);
index 32733d8f54617b6af3cacba93fa855159381f391..2ae62ac18d9fdb42ab14444af9082d0ecce83bf4 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.123 2002/07/29 22:14:11 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.124 2002/08/06 05:40:45 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -80,6 +80,7 @@ static const ScanKeyword ScanKeywords[] = {
    {"constraint", CONSTRAINT},
    {"constraints", CONSTRAINTS},
    {"conversion", CONVERSION_P},
+   {"convert", CONVERT},
    {"copy", COPY},
    {"create", CREATE},
    {"createdb", CREATEDB},
index 64b60a510a45d38508b493ea4423faf909be15fe..ea460aa529787f03bd349b090a4c3a09d983ae38 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for utils/mb
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/utils/mb/Makefile,v 1.18 2002/07/18 02:02:30 ishii Exp $
+#    $Header: /cvsroot/pgsql/src/backend/utils/mb/Makefile,v 1.19 2002/08/06 05:40:45 ishii Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -24,7 +24,7 @@ clean distclean maintainer-clean:
 
 SUBSYS.o: $(OBJS)
    @for dir in $(DIRS); do $(MAKE) -C $$dir all || exit; done
-   $(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+   $(LD) $(LDREL) $(LDOUT) $@ $^
 
 depend dep:
    $(CC) -MM $(CFLAGS) *.c >depend
index 30ff1384080e9b6d230199f39198949429863145..a1ab66bc282b669d51354a726907f84712ea37b0 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for utils/mb/conversion_procs
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/Makefile,v 1.2 2002/07/18 22:58:08 petere Exp $
+#    $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/Makefile,v 1.3 2002/08/06 05:40:45 ishii Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -14,6 +14,9 @@ include $(top_builddir)/src/Makefile.global
 
 SQLSCRIPT = conversion_create.sql
 
+# This file can be placed as src/test/regress/conversion.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 \
@@ -21,9 +24,7 @@ DIRS = \
    utf8_and_uhc utf8_and_johab utf8_and_tcvn utf8_and_iso8859 \
    euc_jp_and_sjis euc_tw_and_big5
 
-# conversion_name source_encoding destination_encoding function object
-$(SQLSCRIPT): Makefile
-   @set \
+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 \
@@ -87,8 +88,11 @@ $(SQLSCRIPT): Makefile
        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
+
+# conversion_name source_encoding destination_encoding function object
+$(SQLSCRIPT): Makefile
+   @set $(CONVERSIONS) ; \
    while [ "$$#" -gt 0 ] ; \
    do \
        name=$$1;shift; \
@@ -102,6 +106,22 @@ $(SQLSCRIPT): Makefile
        echo "CREATE DEFAULT CONVERSION pg_catalog.$$name FOR '$$se' TO '$$de' FROM $$func;"; \
    done > $@
 
+$(REGRESSION_SCRIPT): Makefile
+   @cp regress_prolog $@; \
+   set $(CONVERSIONS) ; \
+   while [ "$$#" -gt 0 ] ; \
+   do \
+       name=$$1;shift; \
+       se=$$1;shift; \
+       de=$$1; shift; \
+       func=$$1; shift; \
+       obj=$$1; shift; \
+       echo "-- $$se --> $$de"; \
+       echo "SELECT CONVERT('foo' USING $$name);"; \
+       echo "SELECT CONVERT('foo', '$$se', '$$de');"; \
+   done >> $@; \
+   cat regress_epilogue >> $@;
+
 install: all installdirs
    $(INSTALL_DATA) $(SQLSCRIPT) $(DESTDIR)$(datadir)
    @for dir in $(DIRS); do $(MAKE) -C $$dir $@ || exit; done
diff --git a/src/backend/utils/mb/conversion_procs/regress_epilogue b/src/backend/utils/mb/conversion_procs/regress_epilogue
new file mode 100644 (file)
index 0000000..da8238b
--- /dev/null
@@ -0,0 +1,5 @@
+--
+-- return to the super user
+--
+RESET SESSION AUTHORIZATION;
+DROP USER foo;
diff --git a/src/backend/utils/mb/conversion_procs/regress_prolog b/src/backend/utils/mb/conversion_procs/regress_prolog
new file mode 100644 (file)
index 0000000..62a90d2
--- /dev/null
@@ -0,0 +1,25 @@
+--
+-- create user defined conversion
+--
+CREATE USER foo WITH NOCREATEDB NOCREATEUSER;
+SET SESSION AUTHORIZATION foo;
+CREATE CONVERSION myconv FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8;
+--
+-- cannot make same name conversion in same schema
+--
+CREATE CONVERSION myconv FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8;
+--
+-- create default conversion with qualified name
+--
+CREATE DEFAULT CONVERSION public.mydef FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8;
+--
+-- cannot make default conversion with same shcema/for_encoding/to_encoding
+--
+CREATE DEFAULT CONVERSION public.mydef2 FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8;
+--
+-- drop user defined conversion
+--
+DROP CONVERSION myconv;
+DROP CONVERSION mydef;
+--
+-- make sure all pre-defined conversions are fine.
index 12669ed78ddc9b200bd909169d533e21ffea8758..f3dfa81879d0e7917df5ad8a99a07a6fff02808e 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catversion.h,v 1.145 2002/08/04 19:48:10 momjian Exp $
+ * $Id: catversion.h,v 1.146 2002/08/06 05:40:45 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 200208041
+#define CATALOG_VERSION_NO 200208061
 
 #endif
index bd0f176f28a88fb5ce59d3bca19d829a8fbd6b5b..f7e4ec32fdf030743577d0293ed46ffade116da4 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: namespace.h,v 1.17 2002/07/29 23:46:35 tgl Exp $
+ * $Id: namespace.h,v 1.18 2002/08/06 05:40:45 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -80,6 +80,7 @@ extern bool isTempNamespace(Oid namespaceId);
 extern void PushSpecialNamespace(Oid namespaceId);
 extern void PopSpecialNamespace(Oid namespaceId);
 
+extern Oid FindConversionByName(List *conname);
 extern Oid FindDefaultConversionProc(int4 for_encoding, int4 to_encoding);
 
 /* initialization & transaction cleanup code */
index de08137bff8353d13c232172866bce3719c28439..e250d6d5d0a67ab93d46ceff7864fa4ae68867bb 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_conversion.h,v 1.3 2002/08/04 06:54:10 thomas Exp $
+ * $Id: pg_conversion.h,v 1.4 2002/08/06 05:40:45 ishii Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
@@ -90,7 +90,9 @@ extern Oid    ConversionCreate(const char *conname, Oid connamespace,
 extern void ConversionDrop(const char *conname, Oid connamespace,
                           int32 conowner, DropBehavior behavior);
 extern void RemoveConversionById(Oid conversionOid);
-extern Oid FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding);
-extern Oid FindConversionByName(List *conname);
+extern Oid FindConversion(const char *conname, Oid connamespace);
+extern Oid FindDefaultConversion(Oid connamespace, int4 for_encoding, int4 to_encoding);
+
+extern Datum pg_convert3(PG_FUNCTION_ARGS);
 
 #endif   /* PG_CONVERSION_H */
index 3520af4cecf991a3e0f09d23a3db7608943fcbea..afd8a782cc29f05a009d99503442c0194aeb1aba 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.251 2002/08/04 23:46:38 tgl Exp $
+ * $Id: pg_proc.h,v 1.252 2002/08/06 05:40:45 ishii Exp $
  *
  * NOTES
  *   The script catalog/genbki.sh reads this file and generates .bki
@@ -2149,6 +2149,9 @@ DESCR("convert string with specified destination encoding name");
 DATA(insert OID = 1813 (  convert         PGNSP PGUID 12 f f t f s 3 25 "25 19 19"  pg_convert2 - _null_ ));
 DESCR("convert string with specified encoding names");
 
+DATA(insert OID = 90 (  convert           PGNSP PGUID 12 f f t f s 2 25 "25 26"  pg_convert3 - _null_ ));
+DESCR("convert string with specified conversion oid");
+
 DATA(insert OID = 1264 (  pg_char_to_encoding     PGNSP PGUID 12 f f t f s 1 23 "19"  PG_char_to_encoding - _null_ ));
 DESCR("convert encoding name to encoding id");
 
index d1b3cdfba878d4504b84b410fbd78526d99a43a1..f1f496464b140ced68b01bd9ee0d7fd5dcc47fb6 100644 (file)
@@ -25,454 +25,840 @@ DROP CONVERSION myconv;
 DROP CONVERSION mydef;
 --
 -- make sure all pre-defined conversions are fine.
---
--- UNICODE -> SQL_ASCII
+-- UNICODE --> SQL_ASCII
+SELECT CONVERT('foo' USING utf8_to_ascii);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
  convert 
 ---------
  foo
 (1 row)
 
--- SQL_ASCII -> UNICODE
+-- SQL_ASCII --> UNICODE
+SELECT CONVERT('foo' USING ascii_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'SQL_ASCII', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN1
+-- UNICODE --> LATIN1
+SELECT CONVERT('foo' USING utf8_to_iso8859_1);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN1 -> UNICODE
+-- LATIN1 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_1_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_JP -> UNICODE
+-- EUC_JP --> UNICODE
+SELECT CONVERT('foo' USING euc_jp_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'EUC_JP', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> EUC_JP
+-- UNICODE --> EUC_JP
+SELECT CONVERT('foo' USING utf8_to_euc_jp);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'EUC_JP');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_KR -> UNICODE
+-- EUC_KR --> UNICODE
+SELECT CONVERT('foo' USING euc_kr_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'EUC_KR', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> EUC_KR
+-- UNICODE --> EUC_KR
+SELECT CONVERT('foo' USING utf8_to_euc_kr);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'EUC_KR');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_CN -> UNICODE
+-- EUC_CN --> UNICODE
+SELECT CONVERT('foo' USING euc_cn_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> EUC_CN
+-- UNICODE --> EUC_CN
+SELECT CONVERT('foo' USING utf8_to_euc_cn);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_TW -> UNICODE
+-- EUC_TW --> UNICODE
+SELECT CONVERT('foo' USING euc_tw_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'EUC_TW', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> EUC_TW
+-- UNICODE --> EUC_TW
+SELECT CONVERT('foo' USING utf8_to_euc_tw);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'EUC_TW');
  convert 
 ---------
  foo
 (1 row)
 
--- SJIS -> UNICODE
+-- SJIS --> UNICODE
+SELECT CONVERT('foo' USING sjis_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'SJIS', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> SJIS
+-- UNICODE --> SJIS
+SELECT CONVERT('foo' USING utf8_to_sjis);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'SJIS');
  convert 
 ---------
  foo
 (1 row)
 
--- BIG5 -> UNICODE
+-- BIG5 --> UNICODE
+SELECT CONVERT('foo' USING big5_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'BIG5', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> BIG5
+-- UNICODE --> BIG5
+SELECT CONVERT('foo' USING utf8_to_big5);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'BIG5');
  convert 
 ---------
  foo
 (1 row)
 
--- GBK -> UNICODE
+-- GBK --> UNICODE
+SELECT CONVERT('foo' USING gbk_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'GBK', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> GBK
+-- UNICODE --> GBK
+SELECT CONVERT('foo' USING utf8_to_gbk);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'GBK');
  convert 
 ---------
  foo
 (1 row)
 
--- GB18030 -> UNICODE
+-- GB18030 --> UNICODE
+SELECT CONVERT('foo' USING gb18030_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'GB18030', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> GB18030
+-- UNICODE --> GB18030
+SELECT CONVERT('foo' USING utf8_to_gb18030);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'GB18030');
  convert 
 ---------
  foo
 (1 row)
 
--- UHC -> UNICODE
+-- UHC --> UNICODE
+SELECT CONVERT('foo' USING uhc_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UHC', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> UHC
+-- UNICODE --> UHC
+SELECT CONVERT('foo' USING utf8_to_uhc);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'UHC');
  convert 
 ---------
  foo
 (1 row)
 
--- JOHAB -> UNICODE
+-- JOHAB --> UNICODE
+SELECT CONVERT('foo' USING johab_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> JOHAB
+-- UNICODE --> JOHAB
+SELECT CONVERT('foo' USING utf8_to_johab);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
  convert 
 ---------
  foo
 (1 row)
 
--- TCVN -> UNICODE
+-- TCVN --> UNICODE
+SELECT CONVERT('foo' USING tcvn_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'TCVN', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> TCVN
+-- UNICODE --> TCVN
+SELECT CONVERT('foo' USING utf8_to_tcvn);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'TCVN');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN2
+-- UNICODE --> LATIN2
+SELECT CONVERT('foo' USING utf8_to_iso8859_2);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN2');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN2 -> UNICODE
+-- LATIN2 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_2_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN2', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN3
+-- UNICODE --> LATIN3
+SELECT CONVERT('foo' USING utf8_to_iso8859_3);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN3');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN3 -> UNICODE
+-- LATIN3 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_3_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN3', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN4
+-- UNICODE --> LATIN4
+SELECT CONVERT('foo' USING utf8_to_iso8859_4);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN4');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN4 -> UNICODE
+-- LATIN4 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_4_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN4', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN5
+-- UNICODE --> LATIN5
+SELECT CONVERT('foo' USING utf8_to_iso8859_9);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN5');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN5 -> UNICODE
+-- LATIN5 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_9_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN5', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN6
+-- UNICODE --> LATIN6
+SELECT CONVERT('foo' USING utf8_to_iso8859_10);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN6');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN6 -> UNICODE
+-- LATIN6 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_10_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN6', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN7
+-- UNICODE --> LATIN7
+SELECT CONVERT('foo' USING utf8_to_iso8859_13);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN7');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN7 -> UNICODE
+-- LATIN7 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_13_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN7', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN8
+-- UNICODE --> LATIN8
+SELECT CONVERT('foo' USING utf8_to_iso8859_14);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN8');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN8 -> UNICODE
+-- LATIN8 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_14_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN8', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN9
+-- UNICODE --> LATIN9
+SELECT CONVERT('foo' USING utf8_to_iso8859_15);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN9');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN9 -> UNICODE
+-- LATIN9 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_15_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN9', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> LATIN10
+-- UNICODE --> LATIN10
+SELECT CONVERT('foo' USING utf8_to_iso8859_16);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'LATIN10');
  convert 
 ---------
  foo
 (1 row)
 
--- LATIN10 -> UNICODE
+-- LATIN10 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_16_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'LATIN10', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> ISO-8859-5
+-- UNICODE --> ISO-8859-5
+SELECT CONVERT('foo' USING utf8_to_iso8859_5);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-5');
  convert 
 ---------
  foo
 (1 row)
 
--- ISO-8859-5 -> UNICODE
+-- ISO-8859-5 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_5_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'ISO-8859-5', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> ISO-8859-6
+-- UNICODE --> ISO-8859-6
+SELECT CONVERT('foo' USING utf8_to_iso8859_6);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-6');
  convert 
 ---------
  foo
 (1 row)
 
--- ISO-8859-6 -> UNICODE
+-- ISO-8859-6 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_6_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'ISO-8859-6', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> ISO-8859-7
+-- UNICODE --> ISO-8859-7
+SELECT CONVERT('foo' USING utf8_to_iso8859_7);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-7');
  convert 
 ---------
  foo
 (1 row)
 
--- ISO-8859-7 -> UNICODE
+-- ISO-8859-7 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_7_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'ISO-8859-7', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- UNICODE -> ISO-8859-8
+-- UNICODE --> ISO-8859-8
+SELECT CONVERT('foo' USING utf8_to_iso8859_8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-8');
  convert 
 ---------
  foo
 (1 row)
 
--- ISO-8859-8 -> UNICODE
+-- ISO-8859-8 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_8_to_utf8);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'ISO-8859-8', 'UNICODE');
  convert 
 ---------
  foo
 (1 row)
 
--- EUC_JP -> SJIS
+-- 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
+-- 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
+-- 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
+-- 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
+-- 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
+-- 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_TW -> BIG5
+-- 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
+-- 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
+-- 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
+-- 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
+-- 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
+-- MULE_INTERNAL --> BIG5
+SELECT CONVERT('foo' USING mic_to_big5);
+ convert 
+---------
+ foo
+(1 row)
+
 SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
  convert 
 ---------
  foo
 (1 row)
 
+--
+-- return to the super user
+--
 RESET SESSION AUTHORIZATION;
 DROP USER foo;
index 7be4916fec059f1e37b6984c7ec04790c29c9aff..e4639d86278720f95dbee032ef4da7a435e68399 100644 (file)
@@ -23,134 +23,200 @@ DROP CONVERSION myconv;
 DROP CONVERSION mydef;
 --
 -- make sure all pre-defined conversions are fine.
---
--- UNICODE -> SQL_ASCII
+-- UNICODE --> SQL_ASCII
+SELECT CONVERT('foo' USING utf8_to_ascii);
 SELECT CONVERT('foo', 'UNICODE', 'SQL_ASCII');
--- SQL_ASCII -> UNICODE
+-- SQL_ASCII --> UNICODE
+SELECT CONVERT('foo' USING ascii_to_utf8);
 SELECT CONVERT('foo', 'SQL_ASCII', 'UNICODE');
--- UNICODE -> LATIN1
+-- UNICODE --> LATIN1
+SELECT CONVERT('foo' USING utf8_to_iso8859_1);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN1');
--- LATIN1 -> UNICODE
+-- LATIN1 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_1_to_utf8);
 SELECT CONVERT('foo', 'LATIN1', 'UNICODE');
--- EUC_JP -> UNICODE
+-- EUC_JP --> UNICODE
+SELECT CONVERT('foo' USING euc_jp_to_utf8);
 SELECT CONVERT('foo', 'EUC_JP', 'UNICODE');
--- UNICODE -> EUC_JP
+-- UNICODE --> EUC_JP
+SELECT CONVERT('foo' USING utf8_to_euc_jp);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_JP');
--- EUC_KR -> UNICODE
+-- EUC_KR --> UNICODE
+SELECT CONVERT('foo' USING euc_kr_to_utf8);
 SELECT CONVERT('foo', 'EUC_KR', 'UNICODE');
--- UNICODE -> EUC_KR
+-- UNICODE --> EUC_KR
+SELECT CONVERT('foo' USING utf8_to_euc_kr);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_KR');
--- EUC_CN -> UNICODE
+-- EUC_CN --> UNICODE
+SELECT CONVERT('foo' USING euc_cn_to_utf8);
 SELECT CONVERT('foo', 'EUC_CN', 'UNICODE');
--- UNICODE -> EUC_CN
+-- UNICODE --> EUC_CN
+SELECT CONVERT('foo' USING utf8_to_euc_cn);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_CN');
--- EUC_TW -> UNICODE
+-- EUC_TW --> UNICODE
+SELECT CONVERT('foo' USING euc_tw_to_utf8);
 SELECT CONVERT('foo', 'EUC_TW', 'UNICODE');
--- UNICODE -> EUC_TW
+-- UNICODE --> EUC_TW
+SELECT CONVERT('foo' USING utf8_to_euc_tw);
 SELECT CONVERT('foo', 'UNICODE', 'EUC_TW');
--- SJIS -> UNICODE
+-- SJIS --> UNICODE
+SELECT CONVERT('foo' USING sjis_to_utf8);
 SELECT CONVERT('foo', 'SJIS', 'UNICODE');
--- UNICODE -> SJIS
+-- UNICODE --> SJIS
+SELECT CONVERT('foo' USING utf8_to_sjis);
 SELECT CONVERT('foo', 'UNICODE', 'SJIS');
--- BIG5 -> UNICODE
+-- BIG5 --> UNICODE
+SELECT CONVERT('foo' USING big5_to_utf8);
 SELECT CONVERT('foo', 'BIG5', 'UNICODE');
--- UNICODE -> BIG5
+-- UNICODE --> BIG5
+SELECT CONVERT('foo' USING utf8_to_big5);
 SELECT CONVERT('foo', 'UNICODE', 'BIG5');
--- GBK -> UNICODE
+-- GBK --> UNICODE
+SELECT CONVERT('foo' USING gbk_to_utf8);
 SELECT CONVERT('foo', 'GBK', 'UNICODE');
--- UNICODE -> GBK
+-- UNICODE --> GBK
+SELECT CONVERT('foo' USING utf8_to_gbk);
 SELECT CONVERT('foo', 'UNICODE', 'GBK');
--- GB18030 -> UNICODE
+-- GB18030 --> UNICODE
+SELECT CONVERT('foo' USING gb18030_to_utf8);
 SELECT CONVERT('foo', 'GB18030', 'UNICODE');
--- UNICODE -> GB18030
+-- UNICODE --> GB18030
+SELECT CONVERT('foo' USING utf8_to_gb18030);
 SELECT CONVERT('foo', 'UNICODE', 'GB18030');
--- UHC -> UNICODE
+-- UHC --> UNICODE
+SELECT CONVERT('foo' USING uhc_to_utf8);
 SELECT CONVERT('foo', 'UHC', 'UNICODE');
--- UNICODE -> UHC
+-- UNICODE --> UHC
+SELECT CONVERT('foo' USING utf8_to_uhc);
 SELECT CONVERT('foo', 'UNICODE', 'UHC');
--- JOHAB -> UNICODE
+-- JOHAB --> UNICODE
+SELECT CONVERT('foo' USING johab_to_utf8);
 SELECT CONVERT('foo', 'JOHAB', 'UNICODE');
--- UNICODE -> JOHAB
+-- UNICODE --> JOHAB
+SELECT CONVERT('foo' USING utf8_to_johab);
 SELECT CONVERT('foo', 'UNICODE', 'JOHAB');
--- TCVN -> UNICODE
+-- TCVN --> UNICODE
+SELECT CONVERT('foo' USING tcvn_to_utf8);
 SELECT CONVERT('foo', 'TCVN', 'UNICODE');
--- UNICODE -> TCVN
+-- UNICODE --> TCVN
+SELECT CONVERT('foo' USING utf8_to_tcvn);
 SELECT CONVERT('foo', 'UNICODE', 'TCVN');
--- UNICODE -> LATIN2
+-- UNICODE --> LATIN2
+SELECT CONVERT('foo' USING utf8_to_iso8859_2);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN2');
--- LATIN2 -> UNICODE
+-- LATIN2 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_2_to_utf8);
 SELECT CONVERT('foo', 'LATIN2', 'UNICODE');
--- UNICODE -> LATIN3
+-- UNICODE --> LATIN3
+SELECT CONVERT('foo' USING utf8_to_iso8859_3);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN3');
--- LATIN3 -> UNICODE
+-- LATIN3 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_3_to_utf8);
 SELECT CONVERT('foo', 'LATIN3', 'UNICODE');
--- UNICODE -> LATIN4
+-- UNICODE --> LATIN4
+SELECT CONVERT('foo' USING utf8_to_iso8859_4);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN4');
--- LATIN4 -> UNICODE
+-- LATIN4 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_4_to_utf8);
 SELECT CONVERT('foo', 'LATIN4', 'UNICODE');
--- UNICODE -> LATIN5
+-- UNICODE --> LATIN5
+SELECT CONVERT('foo' USING utf8_to_iso8859_9);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN5');
--- LATIN5 -> UNICODE
+-- LATIN5 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_9_to_utf8);
 SELECT CONVERT('foo', 'LATIN5', 'UNICODE');
--- UNICODE -> LATIN6
+-- UNICODE --> LATIN6
+SELECT CONVERT('foo' USING utf8_to_iso8859_10);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN6');
--- LATIN6 -> UNICODE
+-- LATIN6 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_10_to_utf8);
 SELECT CONVERT('foo', 'LATIN6', 'UNICODE');
--- UNICODE -> LATIN7
+-- UNICODE --> LATIN7
+SELECT CONVERT('foo' USING utf8_to_iso8859_13);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN7');
--- LATIN7 -> UNICODE
+-- LATIN7 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_13_to_utf8);
 SELECT CONVERT('foo', 'LATIN7', 'UNICODE');
--- UNICODE -> LATIN8
+-- UNICODE --> LATIN8
+SELECT CONVERT('foo' USING utf8_to_iso8859_14);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN8');
--- LATIN8 -> UNICODE
+-- LATIN8 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_14_to_utf8);
 SELECT CONVERT('foo', 'LATIN8', 'UNICODE');
--- UNICODE -> LATIN9
+-- UNICODE --> LATIN9
+SELECT CONVERT('foo' USING utf8_to_iso8859_15);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN9');
--- LATIN9 -> UNICODE
+-- LATIN9 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_15_to_utf8);
 SELECT CONVERT('foo', 'LATIN9', 'UNICODE');
--- UNICODE -> LATIN10
+-- UNICODE --> LATIN10
+SELECT CONVERT('foo' USING utf8_to_iso8859_16);
 SELECT CONVERT('foo', 'UNICODE', 'LATIN10');
--- LATIN10 -> UNICODE
+-- LATIN10 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_16_to_utf8);
 SELECT CONVERT('foo', 'LATIN10', 'UNICODE');
--- UNICODE -> ISO-8859-5
+-- UNICODE --> ISO-8859-5
+SELECT CONVERT('foo' USING utf8_to_iso8859_5);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-5');
--- ISO-8859-5 -> UNICODE
+-- ISO-8859-5 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_5_to_utf8);
 SELECT CONVERT('foo', 'ISO-8859-5', 'UNICODE');
--- UNICODE -> ISO-8859-6
+-- UNICODE --> ISO-8859-6
+SELECT CONVERT('foo' USING utf8_to_iso8859_6);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-6');
--- ISO-8859-6 -> UNICODE
+-- ISO-8859-6 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_6_to_utf8);
 SELECT CONVERT('foo', 'ISO-8859-6', 'UNICODE');
--- UNICODE -> ISO-8859-7
+-- UNICODE --> ISO-8859-7
+SELECT CONVERT('foo' USING utf8_to_iso8859_7);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-7');
--- ISO-8859-7 -> UNICODE
+-- ISO-8859-7 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_7_to_utf8);
 SELECT CONVERT('foo', 'ISO-8859-7', 'UNICODE');
--- UNICODE -> ISO-8859-8
+-- UNICODE --> ISO-8859-8
+SELECT CONVERT('foo' USING utf8_to_iso8859_8);
 SELECT CONVERT('foo', 'UNICODE', 'ISO-8859-8');
--- ISO-8859-8 -> UNICODE
+-- ISO-8859-8 --> UNICODE
+SELECT CONVERT('foo' USING iso8859_8_to_utf8);
 SELECT CONVERT('foo', 'ISO-8859-8', 'UNICODE');
--- EUC_JP -> SJIS
+-- EUC_JP --> SJIS
+SELECT CONVERT('foo' USING euc_jp_to_sjis);
 SELECT CONVERT('foo', 'EUC_JP', 'SJIS');
--- SJIS -> EUC_JP
+-- SJIS --> EUC_JP
+SELECT CONVERT('foo' USING sjis_to_euc_jp);
 SELECT CONVERT('foo', 'SJIS', 'EUC_JP');
--- EUC_JP -> MULE_INTERNAL
+-- EUC_JP --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_jp_to_mic);
 SELECT CONVERT('foo', 'EUC_JP', 'MULE_INTERNAL');
--- SJIS -> MULE_INTERNAL
+-- SJIS --> MULE_INTERNAL
+SELECT CONVERT('foo' USING sjis_to_mic);
 SELECT CONVERT('foo', 'SJIS', 'MULE_INTERNAL');
--- MULE_INTERNAL -> EUC_JP
+-- MULE_INTERNAL --> EUC_JP
+SELECT CONVERT('foo' USING mic_to_euc_jp);
 SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_JP');
--- MULE_INTERNAL -> SJIS
+-- MULE_INTERNAL --> SJIS
+SELECT CONVERT('foo' USING mic_to_sjis);
 SELECT CONVERT('foo', 'MULE_INTERNAL', 'SJIS');
--- EUC_TW -> BIG5
+-- EUC_TW --> BIG5
+SELECT CONVERT('foo' USING euc_tw_to_big5);
 SELECT CONVERT('foo', 'EUC_TW', 'BIG5');
--- BIG5 -> EUC_TW
+-- BIG5 --> EUC_TW
+SELECT CONVERT('foo' USING big5_to_euc_tw);
 SELECT CONVERT('foo', 'BIG5', 'EUC_TW');
--- EUC_TW -> MULE_INTERNAL
+-- EUC_TW --> MULE_INTERNAL
+SELECT CONVERT('foo' USING euc_tw_to_mic);
 SELECT CONVERT('foo', 'EUC_TW', 'MULE_INTERNAL');
--- BIG5 -> MULE_INTERNAL
+-- BIG5 --> MULE_INTERNAL
+SELECT CONVERT('foo' USING big5_to_mic);
 SELECT CONVERT('foo', 'BIG5', 'MULE_INTERNAL');
--- MULE_INTERNAL -> EUC_TW
+-- MULE_INTERNAL --> EUC_TW
+SELECT CONVERT('foo' USING mic_to_euc_tw);
 SELECT CONVERT('foo', 'MULE_INTERNAL', 'EUC_TW');
--- MULE_INTERNAL -> BIG5
+-- MULE_INTERNAL --> BIG5
+SELECT CONVERT('foo' USING mic_to_big5);
 SELECT CONVERT('foo', 'MULE_INTERNAL', 'BIG5');
+--
+-- return to the super user
+--
 RESET SESSION AUTHORIZATION;
 DROP USER foo;