From: Tom Lane Date: Thu, 29 Jan 2009 19:24:37 +0000 (+0000) Subject: Replace argument-checking Asserts with regular test-and-elog checks in all X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=a55fa0291d26a05746a9d5ffb3764963d11ee01b;p=users%2Fbernd%2Fpostgres.git Replace argument-checking Asserts with regular test-and-elog checks in all encoding conversion functions. These are not can't-happen cases because it's possible to create a conversion with the wrong conversion function for the specified encoding pair. That would lead to an Assert crash in an Assert-enabled build, or incorrect conversion otherwise, neither of which is desirable. This would be a DOS issue if production databases were customarily built with asserts enabled, but fortunately that's not so. Per an observation by Heikki. Back-patch to all supported branches. --- diff --git a/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c b/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c index 5c142d9efc..63d7eb573e 100644 --- a/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/ascii_and_mic/ascii_and_mic.c @@ -39,9 +39,7 @@ ascii_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -55,9 +53,7 @@ mic_to_ascii(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c index f1b4961280..94203bd8ad 100644 --- a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c @@ -86,9 +86,7 @@ koi8r_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -102,9 +100,7 @@ mic_to_koi8r(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -118,9 +114,7 @@ iso_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -134,9 +128,7 @@ mic_to_iso(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -150,9 +142,7 @@ win1251_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -166,9 +156,7 @@ mic_to_win1251(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -182,9 +170,7 @@ win866_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_WIN866); - Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_MULE_INTERNAL); win8662mic(src, dest, len); @@ -198,9 +184,7 @@ mic_to_win866(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL); - Assert(PG_GETARG_INT32(1) == PG_WIN866); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN866); mic2win866(src, dest, len); @@ -215,9 +199,7 @@ koi8r_to_win1251(PG_FUNCTION_ARGS) 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); @@ -235,9 +217,7 @@ win1251_to_koi8r(PG_FUNCTION_ARGS) 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); @@ -255,9 +235,7 @@ koi8r_to_win866(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_KOI8R); - Assert(PG_GETARG_INT32(1) == PG_WIN866); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN866); buf = palloc(len * ENCODING_GROWTH_RATE); koi8r2mic(src, buf, len); @@ -275,9 +253,7 @@ win866_to_koi8r(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_WIN866); - Assert(PG_GETARG_INT32(1) == PG_KOI8R); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_KOI8R); buf = palloc(len * ENCODING_GROWTH_RATE); win8662mic(src, buf, len); @@ -295,9 +271,7 @@ win866_to_win1251(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_WIN866); - Assert(PG_GETARG_INT32(1) == PG_WIN1251); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_WIN1251); /* * Note: There are a few characters like the "Numero" sign that exist in @@ -321,9 +295,7 @@ win1251_to_win866(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_WIN1251); - Assert(PG_GETARG_INT32(1) == PG_WIN866); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_WIN866); /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */ buf = palloc(len * ENCODING_GROWTH_RATE); @@ -342,9 +314,7 @@ iso_to_koi8r(PG_FUNCTION_ARGS) 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); @@ -362,9 +332,7 @@ koi8r_to_iso(PG_FUNCTION_ARGS) 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); @@ -382,9 +350,7 @@ iso_to_win1251(PG_FUNCTION_ARGS) 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 win866_to_win1251() */ buf = palloc(len * ENCODING_GROWTH_RATE); @@ -403,9 +369,7 @@ win1251_to_iso(PG_FUNCTION_ARGS) 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 win866_to_win1251() */ buf = palloc(len * ENCODING_GROWTH_RATE); @@ -424,9 +388,7 @@ iso_to_win866(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_ISO_8859_5); - Assert(PG_GETARG_INT32(1) == PG_WIN866); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN866); /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */ buf = palloc(len * ENCODING_GROWTH_RATE); @@ -445,9 +407,7 @@ win866_to_iso(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); unsigned char *buf; - Assert(PG_GETARG_INT32(0) == PG_WIN866); - Assert(PG_GETARG_INT32(1) == PG_ISO_8859_5); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_ISO_8859_5); /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */ buf = palloc(len * ENCODING_GROWTH_RATE); diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c index 26b68d63ea..c6381b0226 100644 --- a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c @@ -42,9 +42,7 @@ euc_cn_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -58,9 +56,7 @@ mic_to_euc_cn(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c index 51cf69de6a..2dde019e5f 100644 --- a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c +++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c @@ -68,9 +68,7 @@ euc_jp_to_sjis(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - 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); euc_jp2sjis(src, dest, len); @@ -84,9 +82,7 @@ sjis_to_euc_jp(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - 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); sjis2euc_jp(src, dest, len); @@ -100,9 +96,7 @@ euc_jp_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -116,9 +110,7 @@ mic_to_euc_jp(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -132,9 +124,7 @@ sjis_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -148,9 +138,7 @@ mic_to_sjis(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c index 0aa0cd7f94..6b2e517152 100644 --- a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c @@ -42,9 +42,7 @@ euc_kr_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -58,9 +56,7 @@ mic_to_euc_kr(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c index 2ece3d51c2..be5f18e9a0 100644 --- a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c +++ b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c @@ -55,9 +55,7 @@ euc_tw_to_big5(PG_FUNCTION_ARGS) 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); @@ -75,9 +73,7 @@ big5_to_euc_tw(PG_FUNCTION_ARGS) 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); @@ -94,9 +90,7 @@ euc_tw_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -110,9 +104,7 @@ mic_to_euc_tw(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -126,9 +118,7 @@ big5_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -142,9 +132,7 @@ mic_to_big5(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c index b4bee522de..57e6c4c0c9 100644 --- a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c +++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c @@ -54,9 +54,7 @@ latin2_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -70,9 +68,7 @@ mic_to_latin2(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -86,9 +82,7 @@ win1250_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -102,9 +96,7 @@ mic_to_win1250(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -119,9 +111,7 @@ latin2_to_win1250(PG_FUNCTION_ARGS) 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); @@ -139,9 +129,7 @@ win1250_to_latin2(PG_FUNCTION_ARGS) 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); diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c index 3fb72a727e..b7e7e71870 100644 --- a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c @@ -54,9 +54,7 @@ latin1_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -70,9 +68,7 @@ mic_to_latin1(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -86,9 +82,7 @@ latin3_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -102,9 +96,7 @@ mic_to_latin3(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -118,9 +110,7 @@ latin4_to_mic(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -134,9 +124,7 @@ mic_to_latin4(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c b/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c index 14369b4cdf..c27cfbb113 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_ascii/utf8_and_ascii.c @@ -39,9 +39,7 @@ ascii_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -56,9 +54,7 @@ utf8_to_ascii(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c index 42a5bd4411..f4f9c582f3 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c @@ -40,9 +40,7 @@ big5_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_big5(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c index 98715e075b..c9f1ea9811 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c @@ -53,9 +53,7 @@ utf8_to_koi8r(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -70,9 +68,7 @@ koi8r_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -87,9 +83,7 @@ utf8_to_win1251(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -104,9 +98,7 @@ win1251_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -121,9 +113,7 @@ utf8_to_win866(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_UTF8); - Assert(PG_GETARG_INT32(1) == PG_WIN866); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN866); UtfToLocal(src, dest, ULmap_WIN866, sizeof(ULmap_WIN866) / sizeof(pg_utf_to_local), PG_WIN866, len); @@ -138,9 +128,7 @@ win866_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_WIN866); - Assert(PG_GETARG_INT32(1) == PG_UTF8); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_UTF8); LocalToUtf(src, dest, LUmapWIN866, sizeof(LUmapWIN866) / sizeof(pg_local_to_utf), PG_WIN866, len); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c index ff5a995ff9..027232f50b 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c @@ -40,9 +40,7 @@ euc_cn_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_euc_cn(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c index bd07c9c3da..bb3f1c8f2e 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c @@ -40,9 +40,7 @@ euc_jp_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_euc_jp(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c index bee3fd99f7..04df59e3ea 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c @@ -40,9 +40,7 @@ euc_kr_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_euc_kr(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c index 175bede0c6..17c2f53eda 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c @@ -40,9 +40,7 @@ euc_tw_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_euc_tw(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c index a675cddabf..0a7e38458b 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c @@ -40,9 +40,7 @@ gb18030_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_gb18030(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c index 3cbbaa985b..bc638adc6e 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c @@ -40,9 +40,7 @@ gbk_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_gbk(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c index f4cc007dae..614a779e13 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c @@ -118,8 +118,7 @@ iso8859_to_utf8(PG_FUNCTION_ARGS) int len = PG_GETARG_INT32(4); int i; - Assert(PG_GETARG_INT32(1) == PG_UTF8); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8); for (i=0;i= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1); for (i=0;i= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_UTF8); while (len > 0) { @@ -73,9 +71,7 @@ utf8_to_iso8859_1(PG_FUNCTION_ARGS) 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) { diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c index 2ad3319d3c..8ef030659d 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c @@ -40,9 +40,7 @@ johab_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_johab(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c index 864d9daddc..dc4f1ce75f 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c @@ -40,9 +40,7 @@ sjis_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_sjis(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c index 84ca5c0abe..8e5f63ac78 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c @@ -40,9 +40,7 @@ uhc_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -57,9 +55,7 @@ utf8_to_uhc(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c index ca35da82ca..8caf80f1d7 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1250/utf8_and_win1250.c @@ -41,9 +41,7 @@ utf8_to_win1250(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -58,9 +56,7 @@ win1250_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1252/utf8_and_win1252.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1252/utf8_and_win1252.c index 61ecbb481c..fd1cb53069 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win1252/utf8_and_win1252.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1252/utf8_and_win1252.c @@ -41,9 +41,7 @@ utf8_to_win1252(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_UTF8); - Assert(PG_GETARG_INT32(1) == PG_WIN1252); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN1252); UtfToLocal(src, dest, ULmapWIN1252, sizeof(ULmapWIN1252) / sizeof(pg_utf_to_local), PG_WIN1252, len); @@ -58,9 +56,7 @@ win1252_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_WIN1252); - Assert(PG_GETARG_INT32(1) == PG_UTF8); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1252, PG_UTF8); LocalToUtf(src, dest, LUmapWIN1252, sizeof(LUmapWIN1252) / sizeof(pg_local_to_utf), PG_WIN1252, len); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c index e704634a2c..9f24ef190a 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1256/utf8_and_win1256.c @@ -41,9 +41,7 @@ utf8_to_win1256(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -58,9 +56,7 @@ win1256_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win1258/utf8_and_win1258.c b/src/backend/utils/mb/conversion_procs/utf8_and_win1258/utf8_and_win1258.c index 238c5eca8c..22db5fbe7f 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win1258/utf8_and_win1258.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win1258/utf8_and_win1258.c @@ -40,9 +40,7 @@ win1258_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_WIN1258); - Assert(PG_GETARG_INT32(1) == PG_UTF8); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1258, PG_UTF8); LocalToUtf(src, dest, LUmapWIN1258, sizeof(LUmapWIN1258) / sizeof(pg_local_to_utf), PG_WIN1258, len); @@ -57,9 +55,7 @@ utf8_to_win1258(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); int len = PG_GETARG_INT32(4); - Assert(PG_GETARG_INT32(0) == PG_UTF8); - Assert(PG_GETARG_INT32(1) == PG_WIN1258); - Assert(len >= 0); + CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_WIN1258); UtfToLocal(src, dest, ULmapWIN1258, sizeof(ULmapWIN1258) / sizeof(pg_utf_to_local), PG_WIN1258, len); diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c b/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c index b75c6c5203..3726d259a6 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win874/utf8_and_win874.c @@ -41,9 +41,7 @@ utf8_to_win874(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); @@ -58,9 +56,7 @@ win874_to_utf8(PG_FUNCTION_ARGS) unsigned char *dest = (unsigned char *) 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); diff --git a/src/backend/utils/mb/wchar.c b/src/backend/utils/mb/wchar.c index a187f76526..793d5d6e65 100644 --- a/src/backend/utils/mb/wchar.c +++ b/src/backend/utils/mb/wchar.c @@ -1326,6 +1326,39 @@ pg_verify_mbstr(int encoding, const char *mbstr, int len, bool noError) 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 * diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index cb2c66a53e..1d8ea0f78d 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -286,6 +286,19 @@ typedef struct unsigned int utf; /* UTF8 */ } 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 char *from, pg_wchar *to); extern int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len); extern int pg_char_and_wchar_strcmp(const char *s1, const pg_wchar *s2); @@ -340,6 +353,12 @@ extern bool pg_verifymbstr(const char *mbstr, int len, bool noError); 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);