* 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.6 2003/08/04 02:40:07 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c,v 1.6.4.1 2009/01/29 19:25:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_SQL_ASCII, PG_MULE_INTERNAL);
 
    pg_ascii2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_SQL_ASCII);
 
    pg_mic2ascii(src, dest, len);
 
 
  * 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.6.4.2 2008/03/20 10:52:57 heikki Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c,v 1.6.4.3 2009/01/29 19:25:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_MULE_INTERNAL);
 
    koi8r2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_KOI8R);
 
    mic2koi8r(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_MULE_INTERNAL);
 
    iso2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_ISO_8859_5);
 
    mic2iso(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_MULE_INTERNAL);
 
    win12512mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1251);
 
    mic2win1251(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ALT, PG_MULE_INTERNAL);
 
    alt2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_ALT);
 
    mic2alt(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN1251);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    koi8r2mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_KOI8R);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    win12512mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ALT);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    koi8r2mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ALT, PG_KOI8R);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    alt2mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ALT, PG_WIN1251);
 
    /*
     * Note: There are a few characters like the "Numero" sign that exist in
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ALT);
 
    /* Use mic/KOI8R as intermediary, see comment in alt_to_win1251() */
    buf = palloc(len * ENCODING_GROWTH_RATE);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_KOI8R);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    iso2mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ISO_8859_5);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    koi8r2mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN1251);
 
    /* Use mic/KOI8R as intermediary, see comment in alt_to_win1251() */
    buf = palloc(len * ENCODING_GROWTH_RATE);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ISO_8859_5);
 
    /* Use mic/KOI8R as intermediary, see comment in alt_to_win1251() */
    buf = palloc(len * ENCODING_GROWTH_RATE);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_ALT);
 
    /* Use mic/KOI8R as intermediary, see comment in alt_to_win1251() */
    buf = palloc(len * ENCODING_GROWTH_RATE);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ALT, PG_ISO_8859_5);
 
    /* Use mic/KOI8R as intermediary, see comment in alt_to_win1251() */
    buf = palloc(len * ENCODING_GROWTH_RATE);
 
  * 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.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c,v 1.6.4.2 2009/01/29 19:25:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_CN, PG_MULE_INTERNAL);
 
    euc_cn2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_CN);
 
    mic2euc_cn(src, dest, len);
 
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c,v 1.6.4.3 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c,v 1.6.4.4 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    int         len = PG_GETARG_INT32(4);
    unsigned char *buf;
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_JP);
-   Assert(PG_GETARG_INT32(1) == PG_SJIS);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_SJIS);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    euc_jp2mic(src, buf, len);
    int         len = PG_GETARG_INT32(4);
    unsigned char *buf;
 
-   Assert(PG_GETARG_INT32(0) == PG_SJIS);
-   Assert(PG_GETARG_INT32(1) == PG_EUC_JP);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_EUC_JP);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    sjis2mic(src, buf, len);
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_JP);
-   Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_MULE_INTERNAL);
 
    euc_jp2mic(src, dest, len);
 
    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_JP);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_JP);
 
    mic2euc_jp(src, dest, len);
 
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_SJIS);
-   Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_MULE_INTERNAL);
 
    sjis2mic(src, dest, len);
 
    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_SJIS);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_SJIS);
 
    mic2sjis(src, dest, len);
 
 
  * 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.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_KR, PG_MULE_INTERNAL);
 
    euc_kr2mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_KR);
 
    mic2euc_kr(src, dest, len);
 
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    int         len = PG_GETARG_INT32(4);
    unsigned char *buf;
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_TW);
-   Assert(PG_GETARG_INT32(1) == PG_BIG5);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_BIG5);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    euc_tw2mic(src, buf, len);
    int         len = PG_GETARG_INT32(4);
    unsigned char *buf;
 
-   Assert(PG_GETARG_INT32(0) == PG_BIG5);
-   Assert(PG_GETARG_INT32(1) == PG_EUC_TW);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_EUC_TW);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    big52mic(src, buf, len);
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_TW);
-   Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_MULE_INTERNAL);
 
    euc_tw2mic(src, dest, len);
 
    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_TW);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_TW);
 
    mic2euc_tw(src, dest, len);
 
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_BIG5);
-   Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_MULE_INTERNAL);
 
    big52mic(src, dest, len);
 
    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_BIG5);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_BIG5);
 
    mic2big5(src, dest, len);
 
 
  * 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.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN2, PG_MULE_INTERNAL);
 
    latin22mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN2);
 
    mic2latin2(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_MULE_INTERNAL);
 
    win12502mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1250);
 
    mic2win1250(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN2, PG_WIN1250);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    latin22mic(src, buf, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_LATIN2);
 
    buf = palloc(len * ENCODING_GROWTH_RATE);
    win12502mic(src, buf, len);
 
  * 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.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_MULE_INTERNAL);
 
    latin12mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN1);
 
    mic2latin1(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN3, PG_MULE_INTERNAL);
 
    latin32mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN3);
 
    mic2latin3(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN4, PG_MULE_INTERNAL);
 
    latin42mic(src, dest, len);
 
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN4);
 
    mic2latin4(src, dest, len);
 
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_SQL_ASCII, PG_UTF8);
 
    /* this looks wrong, but basically we're just rejecting high-bit-set */
    pg_ascii2mic(src, dest, len);
    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_SQL_ASCII);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_SQL_ASCII);
 
    /* this looks wrong, but basically we're just rejecting high-bit-set */
    pg_mic2ascii(src, dest, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_BIG5);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapBIG5,
               sizeof(LUmapBIG5) / sizeof(pg_local_to_utf), PG_BIG5, len);
    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_BIG5);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_BIG5);
 
    UtfToLocal(src, dest, ULmapBIG5,
               sizeof(ULmapBIG5) / sizeof(pg_utf_to_local), PG_BIG5, len);
 
  * 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.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_KOI8R);
 
    UtfToLocal(src, dest, ULmap_KOI8R,
               sizeof(ULmap_KOI8R) / sizeof(pg_utf_to_local), PG_KOI8R, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapKOI8R,
            sizeof(LUmapKOI8R) / sizeof(pg_local_to_utf), PG_KOI8R, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN1251);
 
    UtfToLocal(src, dest, ULmap_WIN1251,
               sizeof(ULmap_WIN1251) / sizeof(pg_utf_to_local), PG_WIN1251, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapWIN1251,
        sizeof(LUmapWIN1251) / sizeof(pg_local_to_utf), PG_WIN1251, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_ALT);
 
    UtfToLocal(src, dest, ULmap_ALT,
               sizeof(ULmap_ALT) / sizeof(pg_utf_to_local), PG_ALT, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_ALT, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapALT,
               sizeof(LUmapALT) / sizeof(pg_local_to_utf), PG_ALT, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_CN, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapEUC_CN,
          sizeof(LUmapEUC_CN) / sizeof(pg_local_to_utf), PG_EUC_CN, len);
    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_EUC_CN);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_CN);
 
    UtfToLocal(src, dest, ULmapEUC_CN,
               sizeof(ULmapEUC_CN) / sizeof(pg_utf_to_local), PG_EUC_CN, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_JP);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapEUC_JP,
          sizeof(LUmapEUC_JP) / sizeof(pg_local_to_utf), PG_EUC_JP, len);
    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_EUC_JP);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_JP);
 
    UtfToLocal(src, dest, ULmapEUC_JP,
               sizeof(ULmapEUC_JP) / sizeof(pg_utf_to_local), PG_EUC_JP, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_KR, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapEUC_KR,
          sizeof(LUmapEUC_KR) / sizeof(pg_local_to_utf), PG_EUC_KR, len);
    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_EUC_KR);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_KR);
 
    UtfToLocal(src, dest, ULmapEUC_KR,
               sizeof(ULmapEUC_KR) / sizeof(pg_utf_to_local), PG_EUC_KR, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c,v 1.6.4.1 2006/05/21 20:06:44 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c,v 1.6.4.2 2009/01/29 19:25:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_EUC_TW);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapEUC_TW,
          sizeof(LUmapEUC_TW) / sizeof(pg_local_to_utf), PG_EUC_TW, len);
    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_EUC_TW);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_TW);
 
    UtfToLocal(src, dest, ULmapEUC_TW,
               sizeof(ULmapEUC_TW) / sizeof(pg_utf_to_local), PG_EUC_TW, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c,v 1.6.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_GB18030);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_GB18030, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapGB18030,
        sizeof(LUmapGB18030) / sizeof(pg_local_to_utf), PG_GB18030, len);
    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_GB18030);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_GB18030);
 
    UtfToLocal(src, dest, ULmapGB18030,
               sizeof(ULmapGB18030) / sizeof(pg_utf_to_local), PG_GB18030, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c,v 1.6.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_GBK);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_GBK, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapGBK,
               sizeof(LUmapGBK) / sizeof(pg_local_to_utf), PG_GBK, len);
    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_GBK);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_GBK);
 
    UtfToLocal(src, dest, ULmapGBK,
               sizeof(ULmapGBK) / sizeof(pg_utf_to_local), PG_GBK, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c,v 1.7.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c,v 1.7.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8);
 
    LocalToUtf(src, dest, maps[encoding].map1, maps[encoding].size1, encoding, len);
 
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1);
 
    UtfToLocal(src, dest, maps[encoding].map2, maps[encoding].size2, encoding, len);
 
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c,v 1.7.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c,v 1.7.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    int         len = PG_GETARG_INT32(4);
    unsigned short c;
 
-   Assert(PG_GETARG_INT32(0) == PG_LATIN1);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_UTF8);
 
    while (len > 0)
    {
    unsigned short c,
                c1;
 
-   Assert(PG_GETARG_INT32(0) == PG_UTF8);
-   Assert(PG_GETARG_INT32(1) == PG_LATIN1);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_LATIN1);
 
    while (len > 0)
    {
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c,v 1.6.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_JOHAB);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_JOHAB, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapJOHAB,
            sizeof(LUmapJOHAB) / sizeof(pg_local_to_utf), PG_JOHAB, len);
    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_JOHAB);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_JOHAB);
 
    UtfToLocal(src, dest, ULmapJOHAB,
               sizeof(ULmapJOHAB) / sizeof(pg_utf_to_local), PG_JOHAB, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c,v 1.6.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_SJIS);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapSJIS,
               sizeof(LUmapSJIS) / sizeof(pg_local_to_utf), PG_SJIS, len);
    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_SJIS);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_SJIS);
 
    UtfToLocal(src, dest, ULmapSJIS,
               sizeof(ULmapSJIS) / sizeof(pg_utf_to_local), PG_SJIS, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_tcvn/Attic/utf8_and_tcvn.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_tcvn/Attic/utf8_and_tcvn.c,v 1.6.4.2 2009/01/29 19:25:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_TCVN);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_TCVN, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapTCVN,
               sizeof(LUmapTCVN) / sizeof(pg_local_to_utf), PG_TCVN, len);
    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_TCVN);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_TCVN);
 
    UtfToLocal(src, dest, ULmapTCVN,
               sizeof(ULmapTCVN) / sizeof(pg_utf_to_local), PG_TCVN, len);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c,v 1.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c,v 1.6.4.2 2009/01/29 19:25:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    unsigned char *dest = PG_GETARG_CSTRING(3);
    int         len = PG_GETARG_INT32(4);
 
-   Assert(PG_GETARG_INT32(0) == PG_UHC);
-   Assert(PG_GETARG_INT32(1) == PG_UTF8);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UHC, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapUHC,
               sizeof(LUmapUHC) / sizeof(pg_local_to_utf), PG_UHC, len);
    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_UHC);
-   Assert(len >= 0);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_UHC);
 
    UtfToLocal(src, dest, ULmapUHC,
               sizeof(ULmapUHC) / sizeof(pg_utf_to_local), PG_UHC, len);
 
  * 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.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win1250/Attic/utf8_and_win1250.c,v 1.6.4.2 2009/01/29 19:25:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN1250);
 
    UtfToLocal(src, dest, ULmapWIN1250,
               sizeof(ULmapWIN1250) / sizeof(pg_utf_to_local), PG_WIN1250, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapWIN1250,
        sizeof(LUmapWIN1250) / sizeof(pg_local_to_utf), PG_WIN1250, len);
 
  * 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.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win1256/Attic/utf8_and_win1256.c,v 1.6.4.2 2009/01/29 19:25:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN1256);
 
    UtfToLocal(src, dest, ULmapWIN1256,
               sizeof(ULmapWIN1256) / sizeof(pg_utf_to_local), PG_WIN1256, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1256, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapWIN1256,
        sizeof(LUmapWIN1256) / sizeof(pg_local_to_utf), PG_WIN1256, len);
 
  * 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.6.4.1 2006/05/21 20:06:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/utf8_and_win874/Attic/utf8_and_win874.c,v 1.6.4.2 2009/01/29 19:25:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN874);
 
    UtfToLocal(src, dest, ULmapWIN874,
               sizeof(ULmapWIN874) / sizeof(pg_utf_to_local), PG_WIN874, len);
    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);
+   CHECK_ENCODING_CONVERSION_ARGS(PG_WIN874, PG_UTF8);
 
    LocalToUtf(src, dest, LUmapWIN874,
          sizeof(LUmapWIN874) / sizeof(pg_local_to_utf), PG_WIN874, len);
 
 /*
  * conversion functions between pg_wchar and multibyte streams.
  * Tatsuo Ishii
- * $Id: wchar.c,v 1.34.2.5 2008/10/27 19:37:56 tgl Exp $
+ * $Id: wchar.c,v 1.34.2.6 2009/01/29 19:25:14 tgl Exp $
  *
  * WIN1250 client encoding updated by Pavel Behal
  *
    return true;
 }
 
+/*
+ * check_encoding_conversion_args: check arguments of a conversion function
+ *
+ * "expected" arguments can be either an encoding ID or -1 to indicate that
+ * the caller will check whether it accepts the ID.
+ *
+ * Note: the errors here are not really user-facing, so elog instead of
+ * ereport seems sufficient.  Also, we trust that the "expected" encoding
+ * arguments are valid encoding IDs, but we don't trust the actuals.
+ */
+void
+check_encoding_conversion_args(int src_encoding,
+                              int dest_encoding,
+                              int len,
+                              int expected_src_encoding,
+                              int expected_dest_encoding)
+{
+   if (!PG_VALID_ENCODING(src_encoding))
+       elog(ERROR, "invalid source encoding ID: %d", src_encoding);
+   if (src_encoding != expected_src_encoding && expected_src_encoding >= 0)
+       elog(ERROR, "expected source encoding \"%s\", but got \"%s\"",
+            pg_enc2name_tbl[expected_src_encoding].name,
+            pg_enc2name_tbl[src_encoding].name);
+   if (!PG_VALID_ENCODING(dest_encoding))
+       elog(ERROR, "invalid destination encoding ID: %d", dest_encoding);
+   if (dest_encoding != expected_dest_encoding && expected_dest_encoding >= 0)
+       elog(ERROR, "expected destination encoding \"%s\", but got \"%s\"",
+            pg_enc2name_tbl[expected_dest_encoding].name,
+            pg_enc2name_tbl[dest_encoding].name);
+   if (len < 0)
+       elog(ERROR, "encoding conversion length must not be negative");
+}
+
 /*
  * report_invalid_encoding: complain about invalid multibyte character
  *
 
-/* $Id: pg_wchar.h,v 1.48.4.1 2006/05/21 20:06:45 tgl Exp $ */
+/* $Id: pg_wchar.h,v 1.48.4.2 2009/01/29 19:25:14 tgl Exp $ */
 
 #ifndef PG_WCHAR_H
 #define PG_WCHAR_H
    unsigned int utf;           /* UTF-8 */
 } pg_local_to_utf;
 
+/*
+ * Support macro for encoding conversion functions to validate their
+ * arguments.  (This could be made more compact if we included fmgr.h
+ * here, but we don't want to do that because this header file is also
+ * used by frontends.)
+ */
+#define CHECK_ENCODING_CONVERSION_ARGS(srcencoding,destencoding) \
+   check_encoding_conversion_args(PG_GETARG_INT32(0), \
+                                  PG_GETARG_INT32(1), \
+                                  PG_GETARG_INT32(4), \
+                                  (srcencoding), \
+                                  (destencoding))
+
 extern int pg_mb2wchar(const unsigned char *from, pg_wchar *to);
 extern int pg_mb2wchar_with_len(const unsigned char *from, pg_wchar *to, int len);
 extern int pg_char_and_wchar_strcmp(const char *s1, const pg_wchar *s2);
 extern bool pg_verify_mbstr(int encoding, const char *mbstr, int len,
                            bool noError);
 
+extern void check_encoding_conversion_args(int src_encoding,
+                                          int dest_encoding,
+                                          int len,
+                                          int expected_src_encoding,
+                                          int expected_dest_encoding);
+
 extern void report_invalid_encoding(int encoding, const char *mbstr, int len);
 extern void report_untranslatable_char(int src_encoding, int dest_encoding,
                                       const char *mbstr, int len);