diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 52d946e2653fbdfb43efdff2e3edc8e8dca903fa..9bf23ab616e5419ab5458a9e0800863e2871d747 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -1233,7 +1233,7 @@ class sql_result { plugbuffer->add_int32(-1); break; } - if (!objectp(value) || typeof(value) != typeof(Stdio.Buffer())); + if (!objectp(value) || typeof(value) != typeof(Stdio.Buffer())) /* * Like Oracle and SQLite, we accept literal binary values * from single-valued multisets. @@ -1242,20 +1242,20 @@ class sql_result { value = indices(value)[0]; else { value = (string)value; - if (String.width(value) > 8) - if (dtoid[i] == BYTEAOID) + if (cenc == UTF8CHARSET + && (dtoid[i] != BYTEAOID || String.width(value) > 8)) /* - * FIXME We should throw an error here, it would - * have been correct, but for historical reasons and - * as a DWIM convenience we autoconvert to UTF8 here. + * FIXME For BYTEAOID and wide strings we should + * throw an error here, but for historical reasons and + * as a DWIM convenience we autoconvert to UTF8 anyway. */ - value = string_to_utf8(value); - else { - SUSERERROR( - "Wide string %O not supported for type OID %d\n", - value, dtoid[i]); - value = ""; - } + value = string_to_utf8(value); + else if (String.width(value) > 8) { + SUSERERROR( + "Wide string %O not supported for type OID %d\n", + value, dtoid[i]); + value = ""; + } } plugbuffer->add_hstring(value, 4); break;