Bug 3601

Summary: mchar=mvarchar -- ERROR: could not find member 1(416621,416621) of opfamily 416784
Product: Postgres@Etersoft Reporter: Станислав Коробейников <stas>
Component: выполнение запросовAssignee: Станислав Коробейников <stas>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P4 CC: boris, goga, lav
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 4460    
Bug Blocks: 3247    

Description Станислав Коробейников 2009-03-04 14:02:51 MSK
Можно воспроизвести так(должны быть 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;
Comment 1 Станислав Коробейников 2009-03-04 14:12:10 MSK
Тоже самое в postgre c char и varchar работает, в MSSQL (n)char и (n)varchar тоже работает. 
Comment 2 Станислав Коробейников 2009-03-04 15:43:17 MSK
В 8.2.12 тоже самое работает. 
Comment 3 Станислав Коробейников 2009-03-10 12:29:16 MSK
Можно переопределить функции сравнения(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)
Comment 4 Vitaly Lipatov 2009-12-24 13:38:41 MSK
Ну так что, проблемы нет на новых PG 8.3.9 и 8.4.1?
Comment 5 Калюхович Юрий 2009-12-28 12:48:59 MSK
(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;
ошибок не выявлено, можно закрыть багу, как я понимаю