Можно воспроизвести так(должны быть 1с-ные функции): CREATE TABLE a (mchar2 MCHAR(2) NOT NULL); CREATE TABLE c (mvarchar255 mvarchar NOT NULL); SELECT * FROM a, c WHERE mchar2 = mvarchar255; ошибка: ERROR: could not find member 1(416621,416621) of opfamily 416784 Вот так все работает: SELECT * FROM (SELECT 'a '::mchar(2) as mchar2) as a , (SELECT 'a '::mvarchar as mvarchar255) as b WHERE mchar2 = mvarchar255;
Тоже самое в postgre c char и varchar работает, в MSSQL (n)char и (n)varchar тоже работает.
В 8.2.12 тоже самое работает.
Можно переопределить функции сравнения(mchar с mvarchar) mv_mc_icase_eq и mc_mv_icase_eq. И сделать приведение к mvarchar'у перед сравнением. Попробывал работает. Думаю, пока так и надо сделать. Вот такая функция должнга быть: CREATE OR REPLACE FUNCTION mv_mc_icase_eq(b mvarchar, a mchar ) RETURNS boolean AS $BODY$ begin return (a::mvarchar = b); end $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION mv_mc_icase_eq(b mvarchar, a mchar ) OWNER TO postgres; и аналогичная mc_mv_icase_eq(a mchar, b mvarchar)
Ну так что, проблемы нет на новых PG 8.3.9 и 8.4.1?
(In reply to comment #4) > Ну так что, проблемы нет на новых PG 8.3.9 и 8.4.1? > пробовал на 8.3.9 и на 8.4.1, база инициализировалась последней сельтой (1.0.7),тестовый запрос CREATE TABLE a (mchar2 MCHAR(2) NOT NULL); CREATE TABLE c (mvarchar255 mvarchar NOT NULL); SELECT * FROM a, c WHERE mchar2 = mvarchar255; ошибок не выявлено, можно закрыть багу, как я понимаю